1、第二讲第二讲M文件及函数的编写文件及函数的编写MATLAB语言特点:语言特点:n高度简洁,封装化高度简洁,封装化n一种解释型的编程语言一种解释型的编程语言“读一句,执行一句读一句,执行一句”效率不高,特别在遇到循环语句时效率不高,特别在遇到循环语句时程序运行时离不开程序运行时离不开MATLAB环境环境M文件及函数的编写文件及函数的编写M文件其实是一个像命令集一样的文件其实是一个像命令集一样的ASCII(纯文本纯文本)码文件。正是码文件。正是M文件的这个特点造就了文件的这个特点造就了MATLAB强大的可开发性和可扩展性。强大的可开发性和可扩展性。M文件的两种形式文件的两种形式命令式命令式(M_S
2、cript)函数式函数式(Function)。命令式文件就是命令行的简单叠加,命令式文件就是命令行的简单叠加,MATLAB会会自动按顺序执行文件中的命令。自动按顺序执行文件中的命令。函数式文件主要用以解决参数传递和函数调用的函数式文件主要用以解决参数传递和函数调用的问题。问题。M文件及函数的编写文件及函数的编写1.M-script 文件的编写文件的编写新建新建M文件文件编写指令编写指令调试运行调试运行一般过程一般过程用户在编制此类文件时,只需把所要执行的命令按行编辑到指定的文件中,程序运行时,MATLAB按行执行这些指令。M文件及函数的编写文件及函数的编写几点规则:几点规则:建立好的书写风格,
3、保持程序的可读性。m为文件的扩展名,在低版本的MATLAB中还要注意文件名不超过8位,文件名和变量的命名规则相同。以符号引导的行是注释行、不可执行,可供heIp命令查询;不需要用end语句作为M文件的结束标志;M文件及函数的编写文件及函数的编写 在运行此函数之前,需要把它所在目录加到MATLAB的搜索路径上去或将文件所在目录设为当前日录。新版本会提示,老版本则出错。运行一个程序,有多种方式。M文件及函数的编写文件及函数的编写MATLAB控制流控制流 for v=expression(表达式)commands (执行语勾)endfor循环语句的一 般格式如下:(1)for循环结构循环结构循环变量
4、循环变量一般为数组一般为数组循环体循环体成对出现成对出现M文件及函数的编写文件及函数的编写While expression(条件式)statementsEnd(2)while 循环结构循环结构成对出现成对出现M文件及函数的编写文件及函数的编写【例1】用循环求解s=0;for i=1:100 s=s+i;ends=0;i=1;while i=100 s=s+i;i=i+1;end不用循环的方法:不用循环的方法:M文件及函数的编写文件及函数的编写s=sum(1:100)【例2】用循环求解求最小的 m,在这种情况下,最好用在这种情况下,最好用while.s=0;i=0;while s A=;for
5、k=1:5 for j=1:5 if k=j A(k,k)=5;elseif abs(k-j)=1 A(k,j)=1;else A(k,j)=0;end endendM文件及函数的编写文件及函数的编写Switch expression case case_1 (commands 1)case case_2 (commands 2)case case_k (commands k)otherwise,(commands)end (4)分支语句switch-case-otherwise注意 在执行过程中,只执行一个case后面的命令并跳出开关,程序在end后继续执行。M文件及函数的编写文件及函数的编
6、写【例例 4】检测掷一次骰子所得的点数是单数还是双数:switch result case1,3,5 disp(odd numbers)case2,4,6 disp(even numbers)otherwise disp(mistake!)end.(前面可能有一些语句)前面可能有一些语句)M文件及函数的编写文件及函数的编写分支语句和分支语句和C C语言的区别:语言的区别:lcase 语句中条件不能重复,否则列在后面语句中条件不能重复,否则列在后面的条件将不能执行的条件将不能执行l当开关表达式的值等于某表达式,执行该语句当开关表达式的值等于某表达式,执行该语句后结束该结构,不用后结束该结构,不用
7、 breaklotherwise 语句,不是语句,不是 defaultl程序的执行结果和各个程序的执行结果和各个case顺序无关顺序无关M文件及函数的编写文件及函数的编写(5)try-catch 结构结构try (commands1)catch(commands2)end该命令总被执行,若正确,该命令总被执行,若正确,则跳出此结构则跳出此结构仅当组命令仅当组命令1出现执行错出现执行错误,才执行该命令。误,才执行该命令。M文件及函数的编写文件及函数的编写3.交互式输入交互式输入(1)用户输入提示命令用户输入提示命令inputinput 命令用来接收用户从键盘输入数据、命令用来接收用户从键盘输入数
8、据、字符串或表达式,并接收输入值。其常用格字符串或表达式,并接收输入值。其常用格式:式:运行此命今后,将给出文字提示,并等待键盘输入。Rinput(what is your name?,s)运行此命令后,MATLAB将等待输入,并把输入当做字符串,赋给变量R。Rinput(How many apples)M文件及函数的编写文件及函数的编写Pause 暂停程序等待回应;暂停程序等待回应;Pause(n)程序运行中等待程序运行中等待n秒后继续运行;秒后继续运行;Pause on 显示其后的显示其后的 Pause命令,并且执行命令,并且执行pause命令;命令;Pause off 显示其后的显示其后
9、的pause命令,但不执命令,但不执行该命令。行该命令。(2)等待用户反应命令)等待用户反应命令pause此命令用于使程序暂时终止运行,等待用户按任此命令用于使程序暂时终止运行,等待用户按任意键后继续运行。意键后继续运行。此函数的调用形式如下:此函数的调用形式如下:M文件及函数的编写文件及函数的编写(3)中断命令)中断命令break break语句常常用在循环语句中。通过使用break语句,可不必等待循环的自然结束,而根据循环只设的条件来判断是否跳出循环。testinput.m(4)等待键盘输入)等待键盘输入 keyboard 使程序进入暂时等待状态,但并没退出执行,可以修改参数,和运行其他指
10、令等。(5)显示文字或数组)显示文字或数组 disp M文件及函数的编写文件及函数的编写4.4.MATLAB 函数的编写函数的编写【例例 5】若最大值不为若最大值不为 10000,需修改程序对,需修改程序对 m 和和 10000 值的设置,不适合于值的设置,不适合于M-script.l函数是函数是 MATLAB 编程的主流方法编程的主流方法l除了函数外,还可以采用除了函数外,还可以采用 M-script 文件文件lM-script 适合于小规模适合于小规模M文件及函数的编写文件及函数的编写(1)MATLAB 语言的函数的基本结构语言的函数的基本结构若一个若一个function作为一个作为一个M
11、文件存储,切记其存文件存储,切记其存储文件名应和函数名一样!储文件名应和函数名一样!(1)函数定义行(关键字)函数定义行(关键字function)functionout1,out2,.=funcname(in1,in2,.)注释段注释段 输入返回变量的检测输入返回变量的检测 函数体语句函数体语句输入和输出(返回)的参数个数分别由输入和输出(返回)的参数个数分别由nargin和和nargout两个两个MATLAB保留的变量来给出。保留的变量来给出。(2)第一行帮助行,)第一行帮助行,以(以(%)开头,作为)开头,作为lookfor指令搜索的行指令搜索的行M文件及函数的编写文件及函数的编写(3)函
12、数体说明及有关注解以(%)开头,用以说明函数的作用及有关内容(4)函数体语句函数体内使用的除返回和输入变量这些在function语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除掉。如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。M文件及函数的编写文件及函数的编写【例例6】前面的要求,前面的要求,m,10000无需修改程序无需修改程序1.写好程序,存成写好程序,存成findsum.m文件文件function s,m=findsum(k)s=0;m=0;while(s1 k=n*my_fact(n-1)
13、;elseif n=0|n=1 k=1;else error(U input a wrong parameter!)end2.在在command window中调用:中调用:num=my_fact(11)M文件及函数的编写文件及函数的编写1.写好程序,存成写好程序,存成my_fact.m文件文件prod(1:1000)使用使用tic和和toc函数,函数,测试一下该函数的运行效率。测试一下该函数的运行效率。显式程序运行的时间。显式程序运行的时间。tic;num=my_fact(500);toctic;num=prod(1:1000);toc函数的函数名与存储名要一致。函数的函数名与存储名要一致。
14、函数名首字符必须为字母。其后可为字母函数名首字符必须为字母。其后可为字母数字下划线等。长度小于数字下划线等。长度小于31个字符。个字符。不推荐在同一文件中,写多个函数。不推荐在同一文件中,写多个函数。建议每个函数单独写成一个文件,由主程建议每个函数单独写成一个文件,由主程序调用,主程序不要写成函数形式。序调用,主程序不要写成函数形式。函数编写注意事项:函数编写注意事项:M文件及函数的编写文件及函数的编写5 程序设计的优化程序设计的优化虽然虽然MATLAB程序语言高度集成,但由于程序语言高度集成,但由于MATLAB属于解释型语言,在执行效率方面属于解释型语言,在执行效率方面还是存在一些不足,因此
15、,如何优化程序,还是存在一些不足,因此,如何优化程序,特别是在大型的运算与仿真中,是一个很重特别是在大型的运算与仿真中,是一个很重要的话题。要的话题。M文件及函数的编写文件及函数的编写(1)以矩阵作为操作主体以矩阵作为操作主体循环运算是MATLAB语言的最大弱点。在程序设计时应当尽可能避免循环运算,尽量用向量化的运算来代替循环操作多重循环,将执行次数少循环的放在外环;在MATLAB编程过程中应当强调对矩阵本身整体的运算,避免对矩阵元素的操作。绝大多数的循环运算是可以转换为向量运算;尽量使用内部函数尽量使用内部函数M文件及函数的编写文件及函数的编写举些简单的例子,说明举些简单的例子,说明c语言和
16、语言和matlab的区别:的区别:例例1 找出数组找出数组A=2,5,7,8,4,9,12中,所有大于中,所有大于6的元素及其下标的元素及其下标x=find(A6);%找出下标找出下标B=A(x);找出所有大于找出所有大于6的元素的元素例例2 找出一个数组中为素数的元素找出一个数组中为素数的元素isprime(A)虽然在MATLAB语言中没有规定变虽使用时必须预先定义,但是对于未定义的变量,如果操作过程中出现越界赋值时,系统将不得不对变量进行扩充,这样的操作大大降低了程序运行的效率,所以,对于可能出现变量维数不断扩大的问题,应当预先估计变量可能出现的最大维数,进行预定义。(2)数据的预定义数据
17、的预定义M文件及函数的编写文件及函数的编写(3)充分利用充分利用matlab中已经集成的函数中已经集成的函数对存储的合理操作及管理也会提高程序运行的效率。MATLAB语言提供了一系列的函数用以管理内存。函数名函数名说明说明clear从内存中清除所有变量及函数从内存中清除所有变量及函数pack重新分配内存重新分配内存quit退出退出MATLAB环境,释放所有内存环境,释放所有内存save把指定变量存储至磁盘把指定变量存储至磁盘load从磁盘中调出指定变量从磁盘中调出指定变量(3)内存的管理内存的管理M文件及函数的编写文件及函数的编写 执行错误的发生是由于在程序运行过程中,出现溢出或死循环等引起的
18、,这些错误都与程序本身有关,并且较难发现解决。(1)M文件错误的种类文件错误的种类M文件一般有语法错误和执行错误两种。语法错误发生在M文件程序代码的解释过程中,一般是由函数参数输入类型有误或矩阵运算阶数不符等引起的。6 程序调试程序调试M文件及函数的编写文件及函数的编写l避免出现NaN、Inf或空矩阵等;l在可能出现上述异常数值的地方提供控制语句来识别;l识别函数有isnan、isinf、isempty1sn等。处理异常的常用方法:处理异常的常用方法:M文件及函数的编写文件及函数的编写(2)调试过程)调试过程l在M文件中设置断点l单步运行,通过输出信息和单步运行,通过输出信息和workspace的变量的变量来查看程序是否运行正常来查看程序是否运行正常l巧用巧用“;”,运行到适当的地方输出信息,运行到适当的地方输出信息,帮助分析。帮助分析。l改变输入信息,查看出错症结改变输入信息,查看出错症结l使用使用profile,tic,toc,cputime函数查看文件运行函数查看文件运行耗时及各部分性能,以便化简。耗时及各部分性能,以便化简。M文件及函数的编写文件及函数的编写