第2章MATLAB程序设计【本章学习目标】●掌握建立和执行M文件的方法。●掌握利用if语句、switch语句实现选择结构的方法。●掌握利用for语句、while语句实现循环结构的方法。●熟悉利用向量运算来代替循环操作的方法。●掌握定义和调用MATLAB函数的方法。2.1M文件Matlab命令有两种执行方式:交互式的命令执行方式,M文件的程序执行方式•M文件:由MATLAB语句构成的程序文件称为M文件,它将m作为文件的扩展名,用ASCII码存贮。2.1.1M文件的建立与打开1.建立新的M文件(1)命令按钮操作。(2)菜单操作。(3)命令操作。2.打开已有的M文件(1)命令按钮操作。(2)菜单操作。(3)命令操作。(4)在当前窗口中双击鼠标打开2.1.2M文件的分类M文件可以根据调用方式的不同分为两类:命令文件(ScriptFile)和函数文件(FunctionFile)。见例2-1(1)命令文件没有输入参数,也不返回输出参数,而函数文件可以带输入参数,也可返回输出参数。(2)命令文件对MATLAB工作空间中的变量进行操作,文件中所有命令的执行结果也完全返回到工作空间中,而函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量被清除。(3)命令文件可以直接运行,在MATLAB命令窗口输入命令文件的名字,就会顺序执行命令文件中的命令,而函数文件不能直接运行,而要以函数调用的方式来调用它2.2程序控制结构2.2.1顺序结构见例2-2顺序结构是指按照程序中语句的排列顺序依次执行,一般涉及数据的输入、数据的计算或处理、数据的输出等内容。1.数据的输入从键盘输入数据,则可以使用input函数来进行,该函数的调用格式为A=input(提示信息,选项);其中,“提示信息”为一个字符串,用于提示用户输入什么样的数据。例如,从键盘输入A矩阵,可以采用下面的命令来完成:A=input('输入A矩阵:');如果在input函数调用时采用's'选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用命令:xm=input(‘What’‘syourname?’,‘s’);2.数据的输出在命令窗口输出函数主要有disp函数,其调用格式为disp(输出项)其中,输出项既可以为字符串,也可以为矩阵。例如:A='Hello,World!';disp(A)3.程序的暂停当程序运行时,为了查看程序的中间结果或者观看输出的图形,有时需要暂停程序的执行。这时可以使用pause函数,其调用格式为pause(延迟秒数)如果省略延迟时间,则将暂停程序,直到用户按任一键后程序继续执行。若要强行中止程序的运行可使用Ctrl+C组合键。见例2-22.2.2选择结构见例2-3选择结构是根据给定的条件成立或不成立,分别执行不同的语句。1.if语句(1)单分支if语句:if条件语句块end(2)双分支if语句:if条件语句块1else语句块2end【例2.3】见P35(3)多分支if语句:见例2-4if条件1语句块1elseif条件2语句块2……elseif条件n语句块nelse语句块n+1end【例2.4】见P362.switch语句见例2-5:switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为switch表达式case结果表1语句块1case结果表2语句块2……case结果表n语句块notherwise语句块n+1endswitch子句后面的表达式应为一个标量或一个字符串,case子句后面的结果不仅可以为一个标量或一个字符串,而且还可以为一个将多个结果用大括号括起来的单元数据(Cell)。如果case子句后面的结果为一个单元数据,则表达式的值等于该单元数据中的某个元素时,执行相应的语句组。【例2.5】见P373.try语句见例2-6try语句是一种试探性执行语句,为开发人员提供了一种捕获错误的机制,其语句格式为try语句块1catch语句块2endtry语句先试探性执行语句块1,如果语句块1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句块2。【例2.6】见P382.2.3循环结构循环是指按照给定的条件,重复执行指定的语句。1.for语句见例2-7for语句的格式为:for循环变量=表达式1:表达式2:表达式3循环体语句end其中,表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。for语句的循环变量可以是一个列向量。for语句更一般的格式为for循环变量=矩阵表达式循环体语句end执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。【例2.7】【例2.8】【例2.9】见P392.while语句见例2-8while语句的一般格式为while(条件)循环体语句End3.break语句和continue语句break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句外的一语句。continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。见例2-9、例2-104.循环的嵌套【例2.12】设x,y,z均为正整数,求下列不定方程组共有多少组解。这类方程的个数少于未知数的个数的方程称为不定方程,一般没有唯一解,而有多组解。对于这类问题,可采用穷举法,即将所有可能的取值一个一个地去试,看是否满足方程,如满足即是方程的解。首先确定3个变量的可取值,x、y、z均为正整数,所以3个数的最小值是1,而其和为20,所以3者的最大值是18。程序如下:n=0;a=[];forx=1:18fory=1:18z=20-x-y;if25*x+20*y+16*z==400a=[a;x,y,z];n=n+1;endendenddisp(['方程组共有',num2str(n),'组解']);disp(a)40016202520zyxzyx2.3函数文件2.3.1函数文件的基本结构见例2-11函数文件的基本结构为:•function输出形参表=函数名(输入形参表)•注释说明部分•函数体语句其中,以function开头的一行为引导行,表示该M文件是一个函数文件。函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于一个时,则应该用方括号括起来。(1)函数文件名通常由函数名再加上扩展名.m组成,不过函数文件名与函数名也可以不相同。当两者不同时,MATLAB将忽略函数名而确认函数文件名,因此,调用时使用函数文件名。(2)注释说明包括如下3部分内容。●紧随函数文件引导行之后以%开头的第一注释行。这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor关键词查询和help在线帮助用。●第一注释行及之后连续的注释行。通常包括函数输入输出参数的含义及调用格式说明等信息,构成全部在线帮助文本。●与在线帮助文本相隔一空行的注释行。包括函数文件编写和修改的信息,如作者、修改日期、版本等内容,用于软件档案管理。采用help命令或lookfor命令可以显示出注释说明部分的内容,其功能和一般MATLAB函数的帮助信息是一致的。【例2.13】见P43(3)如果在函数文件中插入了return语句,则执行到该语句就结束函数的执行,程序流程转至调用该函数的位置。见例2-122.3.2函数调用例2-13函数调用的一般格式为[输出实参表]=函数名(输入实参表)函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。【例2.14】【例2.15】见P44【例2.14】利用函数文件,实现直角坐标(x,y)与极坐标(ρ,)之间的转换。函数文件tran.m:function[rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);调用tran.m的命令文件main1.m:x=input('Pleaseinputx=:');y=input('Pleaseinputy=:');[rho,the]=tran(x,y)【例2.15】利用函数的递归调用求n!。显然,求n!需要求(n−1)!,这时可采用递归调用。递归调用函数文件factor.m如下:functionf=factor(n)ifn=1f=1;elsef=factor(n-1)*n;%递归调用求(n-1)!end求s=1!+2!+3!+4!+5!。s=0;fori=1:5s=s+factor(i);ends1)!1(11!nnnnn2.3.3函数参数的可调性例2-14在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。【例2.16】nargin用法示例。见P45函数文件examp.m:functionfout=charray(a,b,c)ifnargin==1fout=a.^2;elseifnargin==2fout=a+b;elseifnargin==3fout=(a*b*c)/2;end命令x=examp(1:3)y=examp(1:3,4:6)z=examp(1:3,[1;2;3],15)2.3.4全局变量与局部变量例2-15局部变量,函数文件中的变量是局部的,即在一个函数文件中定义的变量不能被另一个函数文件引用。全局变量的作用域是整个MATLAB工作空间,即全程有效,所有的函数都可以对它进行存取和修改,定义全局变量是函数间传递信息的一种手段。全局变量用global命令定义,格式为:global变量名【例2.17】全局变量应用示例。先建立函数文件wadd.m,该函数将输入的参数加权相加。functionf=wadd(x,y)globalALPHABETAf=ALPHA*x+BETA*y;在命令窗口中输入:globalALPHABETAALPHA=1;BETA=2;s=wadd(1,2)2.4程序调试2.4.1程序调试概述应用程序的错误有两类:一类是语法错误,另一类是程序逻辑错误查找程序逻辑错误的方法:(1)将程序的一些主要中间结果输出到命令窗口,从而确定错误的区段。(2)使用MATLAB的调试菜单(Debug),通过图形界面操作来实现程序调试,包括设置断点、控制程序单步运行等操作。(3)使用键盘终止函数keyboard中断程序的运行,此时将程序的运行处于调试状态,命令窗口的提示符相应变成K,利用命令操作方式来实现程序调试。2.4.2MATLAB调试菜单1.控制单步运行(1)Step:单步运行。每单击一次,程序运行一次,但不进入函数。(2)StepIn:单步运行。遇到函数时进入函数内,仍单步运行。(3)StepOut:停止单步运行。如果是在函数中,跳出函数;如果不在函数中,直接运行到下一个断点处。(4)GoUntilCursor:直接运行到光标所在的位置。2.断点操作(1)Set/ClearBreakpoint:设置或清除断点。(2)Set/ModifyConditionalBreakpoint:设置或修改条件断点。条件断点可以使程序执行到满足一定条件时停止。(3)Enable/DisableBreakpoint:使断点有效或无效。(4)ClearBreakpointsinAllFiles:清除所有断点。(5)StopIfErrors/Warnings:在程序执行出现错误或警告时,停止程序运行,进入调试状态,不包括try…catch语句中的错误。【例2.18】在图示的编辑窗口中,有一个求两个数的最小公倍数的程序commulti.m,试设置断点来控制程序执行。2.5程序性能分析与优化2.5.1程序性能分析通过函数文件性能评估器(Profiler)用户可以很方便地了解程序执行过程中各函数及函数中的每条语句所耗费的时间,从而有针对性地改进程序,提高