四、M文件和流程控制M文件和流程控制MATLAB控制流函数循环控制语句条件控制语句if,switchtry…catch…end结构其它流程控制指令M文件和流程控制(续)M脚本文件和函数文件M脚本文件和函数文件的比较局部变量和全局变量M文件的一般结构M文件和流程控制(续)变量的检测传递和限权使用函数输入输出变脸检测函数子函数和私用函数串演算函数函数句柄调试和剖析4.1MATLAB控制流函数4.1.1循环控制语句forforx=array循环体end循环体被循环执行,执行的次数就是array的列数,array可以是向量也可以是矩阵,循环变量x依次取array的各列,每取一次循环体执行一次。4.1MATLAB控制流函数(续)4.1.1循环控制语句whilewhile表达式循环体end只要表达式为逻辑真,就执行循环体;一旦表达式为假,就结束循环。表达式可以是向量也可以是矩阵,如果表达式为矩阵则当所有的元素都为真才执行循环体,如果表达式为nan,MATLAB认为是假,不执行循环体。例4.1循环控制语句%a中每一个数字等于所在行列数之和fori=1:10forj=1:10a(i,j)=i+j;endenda演示例4.1循环控制语句(续)注意:end必须和for,while成对出现,不可省略。特别是出现循环嵌套时,一定要注意for/while和end的配对问题。4.1.2条件控制语句if,switch1.if条件式1语句段1elseif条件式2语句段2...else语句段n+1end当有多个条件时,条件式1为假再判断elseif的条件式2,如果所有的条件式都不满足,则执行else的语句段n+1,当条件式为真则执行相应的语句段;If…else…end结构也可以是没有elseif和else的简单结构。举例:条件控制语句if举例cost=10;number=12;ifnumber8sums=number*0.95*cost;end,sums演示4.1.2条件控制语句if,switch2.switch开关表达式case表达式1语句段1case表达式2语句段2...otherwise语句段nend(1)将开关表达式依次与case后面的表达式进行比较,如果表达式1不满足,则与下一个表达式2比较,如果都不满足则执行otherwise后面的语句段n;一旦开关表达式与某个表达式相等,则执行其后面的语句段。(2)开关表达式只能是标量或字符串。(3)case后面的表达式可以是标量、字符串或元胞数组,如果是元胞数组则将开关表达式与元胞数组的所有元素进行比较,只要某个元素与开关表达式相等,就执行其后的语句段。举例:例4.2条件控制语句用于学生的成绩管理%exm04_02.mclear;%划分区域:满分(100),优秀(90-99),良好%(80-89),及格(60-79),不及格(60)fori=1:10a{i}=89+i;b{i}=79+i;演示例4.2条件控制语句用于学生的成绩管理小结:1)case后面的表达式可以是元胞数组,只要开关表达式的值与元胞数组中任一个元素值相等,就执行其后的语句段。2)switch指令判断开关表达式的值符合哪一个case,并执行相应的语句段,执行完毕,自动跳出switch结构,不需要break指令。4.1.3try...catch...end结构try语句段1catch语句段2end首先试探性地执行语句段1,如果在此段语句执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并放弃这段语句,转而执行语句段2中的语句,当执行语句段2又出现错误,则终止该结构。举例:try…catch…end结构进行矩阵相乘运算n=4;a=magic(n);%生成4阶魔方矩阵am=3;b=eye(3);%生成3阶单位矩阵b演示4.1.3try...catch...end结构小结:试探出矩阵的大小不匹配时,矩阵无法相乘,则再执行case后面的语句段,将a的子矩阵取出与b矩阵相乘。可以通过这种结构灵活的实现矩阵的乘法运算。4.1.4其他流程控制指令1.break指令break指令可以使包含break的最内层的for或while语句强制终止,立即跳出该结构,执行end后面的命令,break命令一般和If结构结合使用。2.continue指令continue指令用于结束本次for或while循环,只结束本次循环而继续进行下次循环。4.1.4其他流程控制指令(续)3.pause指令pause指令用来使程序运行暂停,等待用户按任意键继续。pause(n)指令用于使程序暂停n秒后再继续执行。4.keyboard指令keyboard指令将“控制权”交给键盘,等待键盘命令,仅当用户输入return指令后,“控制权”才交回程序。4.1.4其他流程控制指令(续)5.input指令input指令用来提示用户应该从键盘输入数值、字符串和表达式,并接受该输入。a=input(‘inputanumber:’)%输入数值给ab=input('inputanumber:','s')%输入字符串给b6.return指令return指令是终止当前命令的执行,并且立即返回到上一级调用函数或等待键盘输入命令,可以用来提前结束程序的运行。4.1.4其他流程控制指令(续)error/lasterr显示出错信息/显示最新出错原因,终止程序运行warning/lastwarn显示警告/显示MATLAB自动给出的最新警告,程序继续运行%exmR=input('Whatisyourname:','s')%以字符串形式赋给RS=input('Howoldareyou?')%键入数值pause(3)%暂停3秒pause%等待用户按任意键error('Youcan''tjointhearmy')%显示出错信息errordlg,warndlg%给出出错、警告对话框4.2M脚本文件和函数文件M文件由两种形式:M脚本文件和M函数文件,可在MATLAB的M文件编辑/调试器中进行编写和调试运行。4.2M脚本文件和函数文件(续)创建M文件的方法:在指令窗运行指令edit即可打开M文件编辑/调试器;单击工具条上的图标也可打开M文件编辑/调试器;选择菜单“File”——“New”——“M-file”,可打开空白的M文件编辑器。4.2M脚本文件和函数文件(续)打开已有M文件的方法:在指令窗运行指令editfilename;单击工具条上的图标;选择菜单“File”——“Open”——“M-file”;直接在资源浏览器中双击文件。4.2.1M脚本文件和函数文件的比较1.脚本文件的特点(1)脚本文件中的命令格式和前后位置,与在命令窗口中输入的没有任何区别。(2)MATLAB在运行脚本文件时,只是简单地按顺序从文件中读取一条条命令,送到MATLAB命令窗口中去执行。(3)与在命令窗口中直接运行命令一样,脚本文件运行产生的变量都是驻留在MATLAB的工作空间(workspace)中,可以很方便地查看变量,除非用clear命令清除;脚本文件的命令也可以访问工作空间的所有数据,因此要注意避免变量的覆盖而造成程序出错。4.2.1M脚本文件和函数文件的比较2.函数文件的特点(1)第一行总是以“function”引导的函数声明行;函数声明行的格式:function[输出变量列表]=函数名(输入变量列表)(2)函数文件在运行过程中产生的变量都存放在函数本身的工作空间;(3)当文件执行完最后一条命令或遇到“return”命令时,就结束函数文件的运行,同时函数工作空间的变量就被清除;(4)函数的工作空间随具体的M函数文件调用而产生,随调用结束而删除,是独立的、临时的,在MATLAB运行过程中可以产生任意多个临时的函数空间。4.2.1M脚本文件和函数文件的比较M脚本文件%exm04_Mfile.mx=-5ifx0f=-1;elseifx==0f=0;elsef=1;endM函数文件%exm04_funfile.mfunctionm=SIGN(y)ify0m=-1;elseify==0m=0;elsem=1;end指令窗运行exm04_Mfilef=-1指令窗运行x=-5;f=exm04_funfile(x)f=-14.2.1M脚本文件和函数文件的比较注意:M脚本文件一般用作主程序,由命令行组成。M函数文件需注意几点:1)必须以关键字“function”开头;2)第一行必须是函数声明行;3)函数名尽量与文件名一致,如果不一致,调用该函数时应使用文件名。4.2.2局部变量和全局变量局部变量(LocalVariables)是在函数体内部使用的变量,其影响范围只能在本函数内,只在函数执行期间存在;全局变量(GlobalVariables)是可以在不同的函数工作空间和MATALB工作空间中共享使用的变量。4.2.2局部变量和全局变量(续)当使用global指令指定全局变量时,必须对每个共享该变量的函数和基本工作空间进行专门的global定义。如果某个函数使全局变量的内容发生改变,其它函数空间及基本工作空间的同名变量也随之改变,除非所有和全局变量有关的工作空间都被删除,否则全局变量始终存在。全局变量必须在该变量被使用前声明为全局变量,建议放在首行声明。4.2.2局部变量和全局变量(续)M脚本文件中的变量是全局变量,运行完毕后变量仍保存在工作空间,可以进行访问;M函数内部定义的变量是局部变量,只能在函数内部访问;可以将函数内的变量声明为全局变量,利用“global”指令,为了与其它变量进行区分,通常用大写字母表示全局变量。4.2.2局部变量和全局变量(续)例如对exm04_funfile.m进行如下修改:%exm04_funfile.m%exm04funfile2.mfunctionm=SIGN(y)functionm=SIGNify0globalm=-1;ifY0elseify=0m=-1;m=0;elseifY=0;elsem=0;m=1;elseendm=1;end4.2.2局部变量和全局变量(续)则指令窗中执行指令改为globalY;Y=-5;f=exm04_funfile2f=-1可见利用全局变量可以实现函数间参数的传递,但是破坏函数的封装性,因此不提倡使用全局变量。4.2.3M文件的一般结构1)函数声明行:以关键字“function”开头,包括函数名以及输入输出宗量列表。2)H1行(用%开头的第一注释行):包括大写函数名,对函数功能的简要描述,主要用于关键词查询和help在线帮助。3)在线帮助文本(用%开头):包括对函数输入输出宗量的解释、函数调用格式等。执行指令helpfunname将显示第一注释行和在线帮助文本的内容。4)编写和修改记录(用%开头):与注释行间用“空行”分隔,标志该文件的作者、日期、版本等信息。5)函数体:与前面的注释行以“空行”分隔,由完成函数功能的命令行组成。函数体中可以加入以“%”开头的注释语句。4.2.3M文件的一般结构(续)M函数文件的必要组成部分是“函数声明行”和“函数体”,其他仅为增加可读性和方便使用而设。functiony=Ex0502(zeta)函数声明行%EX0502Stepresponseofquadraticsystem.第一注释行%二阶系统时域响应曲线%zeta阻尼系数帮助文本%y时域响应%%copyright2003-08-01编写记录函数主体x=0:0.1:20;y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta))plot(x,y)注意:脚本文件没有函数声明行4.3变量的检测传递和限权使用函数4.3.1输入输出变量检测函数nargin在函数体内获取实际输入变量的个数nargout在函数体内获取实际输出变量的个数nargin(‘fun’)在函数体外获取’fun’指定函数的输入参数个数nargout(‘fun’)在函数体外获取’fun