




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、四、M文件和流程控制M文件和流程控制MATLAB控制流函数n循环控制语句n条件控制语句if,switchntrycatchend结构n其它流程控制指令M文件和流程控制(续)M脚本文件和函数文件nM脚本文件和函数文件的比较n局部变量和全局变量nM文件的一般结构M文件和流程控制(续)变量的检测传递和限权使用函数n输入输出变脸检测函数n子函数和私用函数串演算函数函数句柄调试和剖析4.1 MATLAB4.1 MATLAB控制流函数控制流函数4.1.1 4.1.1 循环控制语句循环控制语句forfor for x=array for x=array 循环体循环体end end 循环体被循环执行,执行的次
2、数就是arrayarray的列数,arrayarray可以是向量也可以是矩阵,循环变量x x依次取arrayarray的各列,每取一次循环体执行一次。 4.1 MATLAB4.1 MATLAB控制流函数(续)控制流函数(续)4.1.1 4.1.1 循环控制语句循环控制语句whilewhile while while 表达式表达式 循环体循环体end end 只要表达式为逻辑真,就执行循环体;一旦表达式为假,就结束循环。表达式可以是向量也可以是矩阵,如果表达式为矩阵则当所有的元素都为真才执行循环体,如果表达式为nannan,MATLAB认为是假,不执行循环体。 例4.1 循环控制语句%a中每一个
3、数字等于所在行列数之和for i = 1:10 for j = 1:10 a(i,j) = i+j; endenda演示例4.1 循环控制语句(续)注意:注意: end必须和必须和for, while成对出现成对出现,不可,不可省略。特别是出现循环嵌套时,一定要注省略。特别是出现循环嵌套时,一定要注意意for/while和和end的配对问题。的配对问题。4.1.2 条件控制语句条件控制语句if,switch1. if 条件式条件式1 语句段语句段1 elseif 条件式条件式2语句段语句段2. else 语句段语句段n+1 end 当有多个条件时,条件式1为假再判断elseifelseif的条
4、件式2,如果所有的条件式都不满足,则执行elseelse的语句段n+1,当条件式为真则执行相应的语句段; Ifelseend结构也可以是没有elseif和else的简单结构。 举例:条件控制语句if举例cost=10;number=12;if number8 sums=number*0.95*cost;end,sums演示4.1.2 条件控制语句条件控制语句if,switch2. switch 开关表达式开关表达式case 表达式表达式1 语句段语句段1 case表达式表达式2 语句段语句段2. otherwise 语句段语句段n end (1) 将开关表达式依次与case后面的表达式进行比较
5、,如果表达式1不满足,则与下一个表达式2比较,如果都不满足则执行otherwise后面的语句段n;一旦开关表达式与某个表达式相等,则执行其后面的语句段。 (2) 开关表达式只能是标量或字符串。 (3) case后面的表达式可以是标量、字符串或元胞数组,如果是元胞数组则将开关表达式与元胞数组的所有元素进行比较,只要某个元素与开关表达式相等,就执行其后的语句段。 举例:例4.2 条件控制语句用于学生的成绩管理%exm04_02.mclear;%划分区域:满分(100),优秀(90-99),良好%(80-89),及格(60-79),不及格(60)for i = 1:10 ai = 89+i; bi
6、= 79+i;演示例4.2 条件控制语句用于学生的成绩管理小结:1)case后面的表达式可以是元胞数组,只要开关表达式的值与元胞数组中任一个元素值相等,就执行其后的语句段。 2)switch指令判断开关表达式的值符合哪一个case,并执行相应的语句段,执行完毕,自动跳出switch结构,不需要break指令。4.1.3 try. catch. end结构结构try 语句段语句段1catch 语句段语句段2end 首先试探性地执行语句段1,如果在此段语句执行过程中出现错误,则将错误信息赋给保留的lasterrlasterr变量,并放弃这段语句,转而执行语句段2中的语句,当执行语句段2又出现错误,
7、则终止该结构。举例:trycatchend结构进行矩阵相乘运算n=4;a=magic(n); %生成4阶魔方矩阵am=3; b=eye(3); %生成3阶单位矩阵b演示4.1.3 try. catch. end结构结构小结:试探出矩阵的大小不匹配时,矩阵无法相乘,则再执行case后面的语句段,将a的子矩阵取出与b矩阵相乘。可以通过这种结构灵活的实现矩阵的乘法运算。4.1.4 4.1.4 其他流程控制指令其他流程控制指令 1. break1. break指令指令 breakbreak指令可以使包含breakbreak的最内层的forfor或whilewhile语句强制终止,立即跳出该结构,执行e
8、ndend后面的命令,breakbreak命令一般和IfIf结构结合使用。2. continue2. continue指令指令 continuecontinue指令用于结束本次forfor或whilewhile循环,只结束本次循环而继续进行下次循环。4.1.4 4.1.4 其他流程控制指令其他流程控制指令( (续续) ) 3. pause3. pause指令指令 pausepause指令用来使程序运行暂停,等待用户按任意键继续 。 pause(n)pause(n)指令用于使程序暂停n秒后再继续执行。 4. keyboard4. keyboard指令指令 keyboardkeyboard指令将“
9、控制权”交给键盘,等待键盘命令,仅当用户输入returnreturn指令后,“控制权”才交回程序。4.1.4 4.1.4 其他流程控制指令其他流程控制指令( (续续) ) 5. input5. input指令指令 inputinput指令用来提示用户应该从键盘输入数值、字符串和表达式,并接受该输入。 a=a=input(inputinput(input a number:) a number:) %输入数值给a b=b=input(inputinput(input a number:,s) a number:,s) % %输入字符串给b 6. return6. return指令指令 retur
10、n指令是终止当前命令的执行,并且立即返回到上一级调用函数或等待键盘输入命令,可以用来提前结束程序的运行。 4.1.4 4.1.4 其他流程控制指令其他流程控制指令( (续续) ) error/lasterr 显示出错信息/显示最新出错原因,终止程序运行 warning/lastwarn 显示警告/显示MATLAB自动给出的最新警告,程序继续运行%exmR=input(What is your name:,s) % %以字符串形式赋给以字符串形式赋给R RS=input(How old are you?) % %键入数值键入数值pause(3) % %暂停暂停3 3秒秒pause % %等待用户
11、按任意键等待用户按任意键error(You cant join the army) % %显示出错信息显示出错信息errordlg,warndlg % %给出出错、警告对话框给出出错、警告对话框4.2 M4.2 M脚本文件和函数文件脚本文件和函数文件 M文件由两种形式:M脚本文件和M函数文件,可在MATLAB的M文件编辑/调试器中进行编写和调试运行。4.2 M4.2 M脚本文件和函数文件(续)脚本文件和函数文件(续)创建创建M M文件文件的方法:n 在指令窗运行指令editedit即可打开M文件编辑/调试器;n 单击工具条上的 图标也可打开M文件编辑/调试器;n 选择菜单菜单“File”“Ne
12、w”File”“New”“M-file”“M-file”,可打开空白的M文件编辑器 。 4.2 M4.2 M脚本文件和函数文件(续)脚本文件和函数文件(续)打开已有打开已有M M文件文件的方法:n在指令窗运行指令edit filenameedit filename ;n单击工具条上的 图标;n选择菜单菜单“File”“Open”File”“Open”“M-file”“M-file”;n直接在资源浏览器中双击文件。 4.2.1 M4.2.1 M脚本文件和函数文件的比较脚本文件和函数文件的比较1.1.脚本文件的特点脚本文件的特点(1) 脚本文件中的命令格式和前后位置,与在命令窗口中输入的没有任何区
13、别。(2) MATLAB在运行脚本文件时,只是简单地按顺序从文件中读取一条条命令,送到MATLAB命令窗口中去执行。(3) 与在命令窗口中直接运行命令一样,脚本文件运行产生的变量都是驻留在MATLAB的工作空间(workspace)(workspace)中,可以很方便地查看变量,除非用clearclear命令清除;脚本文件的命令也可以访问工作空间的所有数据,因此要注意避免变量的覆盖而造成程序出错。4.2.1 M4.2.1 M脚本文件和函数文件的比较脚本文件和函数文件的比较2. 2. 函数文件的特点函数文件的特点(1) 第一行总是以“function”function”引导的函数声明行; 函数声
14、明行的格式:函数声明行的格式: function function 输出变量列表输出变量列表 = = 函数名函数名( (输入变量列表输入变量列表) ) (2) 函数文件在运行过程中产生的变量都存放在函数本身的工作空间;(3) 当文件执行完最后一条命令或遇到“return”命令时,就结束函数文件的运行,同时函数工作空间的变量就被清除;(4) 函数的工作空间随具体的M函数文件调用而产生,随调用结束而删除,是独立的、临时的,在MATLAB运行过程中可以产生任意多个临时的函数空间。 4.2.1 M4.2.1 M脚本文件和函数文件的比较脚本文件和函数文件的比较M M脚本文件脚本文件%exm04_Mfil
15、e.mx= -5if x0 f= -1;elseif x=0 f=0;else f=1;end M函数文件函数文件%exm04_funfile.mfunction m=SIGN(y)if yexm04_Mfileexm04_Mfilef =f = -1 -1指令窗运行指令窗运行 x=-5; x=-5;f=exm04_funfilef=exm04_funfile(x)(x)f =f = -1 -14.2.1 M4.2.1 M脚本文件和函数文件的比较脚本文件和函数文件的比较注意:M脚本文件一般用作主程序,由命令行组成。M函数文件需注意几点:1)必须以关键字“functionfunction”开头;
16、2)第一行必须是函数声明行;3)函数名尽量与文件名一致,如果不一致,调用该函数时应使用文件名。4.2.2 4.2.2 局部变量和全局变量局部变量和全局变量n 局部变量(Local Variables)是在函数体内部使用的变量,其影响范围只能在本函数内,只在函数执行期间存在 ;n全局变量(Global Variables)是可以在不同的函数工作空间和MATALB工作空间中共享使用的变量。4.2.2 4.2.2 局部变量和全局变量(续)局部变量和全局变量(续)n 当使用globalglobal指令指定全局变量时,必须对每个共享该变量的函数和基本工作空间进行专门的globalglobal定义。如果某
17、个函数使全局变量的内容发生改变,其它函数空间及基本工作空间的同名变量也随之改变,除非所有和全局变量有关的工作空间都被删除,否则全局变量始终存在。n全局变量必须在该变量被使用前声明为全局变量,建议放在首行声明。4.2.2 4.2.2 局部变量和全局变量(续)局部变量和全局变量(续)n M脚本文件中的变量是全局变量,运行完毕后变量仍保存在工作空间,可以进行访问;n M函数内部定义的变量是局部变量,只能在函数内部访问;n 可以将函数内的变量声明为全局变量,利用“globalglobal”指令,为了与其它变量进行区分,通常用大写字母表示全局变量。4.2.2 4.2.2 局部变量和全局变量(续)局部变量
18、和全局变量(续)例如对例如对exm04_funfile.m 进行如下修改:进行如下修改:%exm04_funfile.m %exm04 funfile2.mfunction m=SIGN(y) function m=SIGN if y0 global m= -1; if Y global Y;Y=-5; f=exm04_funfile2f = -1 可见利用全局变量可以实现函数间参数的传递,但是破坏函数的封装性,因此不提倡使用全局变量。 4.2.3 M4.2.3 M文件的一般结构文件的一般结构1 1)函数声明行函数声明行:以关键字“functionfunction”开头,包括函数名以及输入输出
19、宗量列表。2 2)H1H1行行( (用用% %开头的第一注释行开头的第一注释行) ):包括大写函数名,对函数功能的简要描述,主要用 于关键词查询和helphelp在线帮助。3 3)在线帮助文本在线帮助文本( (用用% %开头开头) ):包括对函数输入输出宗量的解释、函数调用格式等。执行指令help help funnamefunname将显示第一注释行和在线帮助文本的内容。4 4)编写和修改记录编写和修改记录( (用用% %开头开头) ):与注释行间用“空行”分隔,标志该文件的作者、日期、版本等信息。5 5)函数体函数体 :与前面的注释行以“空行”分隔,由完成函数功能的命令行组成。函数体中可以
20、加入以“”开头的注释语句。4.2.3 M4.2.3 M文件的一般结构(续)文件的一般结构(续) M函数文件的必要组成部分是“函数声明行函数声明行”和“函数体函数体”,其他仅为增加可读性和方便使用而设。function y=Ex0502(zeta) 函数声明行函数声明行% EX0502 Step response of quadratic system. 第一注释行第一注释行% 二阶系统时域响应曲线二阶系统时域响应曲线% zeta 阻尼系数阻尼系数 帮助文本帮助文本% y 时域响应时域响应% copyright 2003-08-01 编写记录编写记录 函数主体x=0:0.1:20;y=1-1/s
21、qrt(1-zeta2)*exp(-zeta*x).*sin(sqrt(1-zeta2)*x+acos(zeta)plot(x,y) 注意:脚本文件没有函数声明行4.3 4.3 变量的检测传递和限权使用函数变量的检测传递和限权使用函数4.3.1 4.3.1 输入输出变量检测函数输入输出变量检测函数nargin nargin 在函数体内获取实际输入变量的个数nargout nargout 在函数体内获取实际输出变量的个数nargin(funnargin(fun) ) 在函数体外获取funfun指定函数的输入参数个数nargout(funnargout(fun) ) 在函数体外获取funfun指定
22、函数的输出参数个数inputname(n)inputname(n) 在函数体内返回第n个输入变量的实际调用变量名varargin/varargoutvarargin/varargout 可以获得输入/输出变量的各元素内容“变长度“变量列表例4.3 输入输出宗量的使用 算例演示:例4.3 输入输出宗量的使用(续)n函数声明行中,“变长度”输入输出变量必须在“普通”输入输出变量之后;nvararginvarargin和varargout varargout 本身是元胞数组,当变量被依次分配给“普通”输入输出变量后,剩余变量被逐个分配给vararginvarargin和varargoutvararg
23、out 的元胞;nvararginvarargin和varargoutvarargout的长度取决于分配的输入输出变量数。4.3.2 子函数和私用函数子函数和私用函数1. 子函数子函数在一个M函数文件中,可以包含多个函数,第一个出现的是主函数,其它则为子函数。通过函数文件名调用函数时,调用的是主函数,主函数必须放在函数文件的第一部分,其函数名应该与文件名相同,子函数的次序无任何限制;子函数不能被其它文件的函数调用,只能被同一文件中的函数(可以是主函数或子函数)调用,子函数的优先级仅次于内装函数;同一文件的主函数和子函数变量的工作空间相互独立,参数的传递最好通过输入输出变量进行传递;用helph
24、elp和lookforlookfor命令不能提供子函数的帮助信息。 4.3.2 子函数和私用函数(续)子函数和私用函数(续)2. 2. 私用函数私用函数私用函数是指存放在privateprivate子目录中的M函数文件,具有以下性质:在privateprivate目录下的私用函数,只能被其父目录的M函数文件所调用,而不能被其它目录的函数调用,对其它目录的文件私用函数是不可见的,私用函数可以和其它目录下的函数重名;私用函数父目录的M脚本文件也不可调用私用函数;在函数调用搜索时,私用函数优先于其它MATLAB路径上的任何函数。 4.3.2 子函数和私用函数(续)子函数和私用函数(续)当MATLAB
25、执行程序的过程中遇到一个新“名字”时,查找过程如下:1)是否变量名?2)是否该文件内的子函数?3)是否私用函数?4)是否当前目录上的函数?5)是否MATLAB搜索路径上的函数?6)以上都找不到则显示出错信息。4.4 串演算函数串演算函数为提高计算的灵活性,MATLAB 还提供两种演算函数:串演算函数evaleval和函数句柄演算函数fevalfeval 。 串演算函数evaleval具有对字符串进行计算的能力:y=eval(CEMy=eval(CEM) 执行CEM指定的运算y=eval(CEM1,CEM2y=eval(CEM1,CEM2) 执行CEM1代表的运算,若失败则执行CEM2y1,y2
26、,=eval(CEM)y1,y2,=eval(CEM) 调用CEM代表的函数文件,输出计算结果例4.4 串演算函数的应用%exm04_04.mt=0:0.01*pi:2*pi;P=1,2,4,10;figurefor n=1:4 eval(T=P(n);) 演示4.4 串演算函数(续)串演算函数(续)跨空间执行串演算:evalin (workspace,expression)evalin(workspace,expression1,expression2)其中workspace指不同的工作空间,在evalin中可以是基本工作空间(basebase)和主调函数空间(callercaller)。如
27、果是函数自己的工作空间,可以采用eval命令进行串演算。例4.5 跨空间串演算函数的应用 算例演示:4.5. 4.5. 函数句柄函数句柄函数句柄(Function handle)是包含了函数的路径、函数名、类型以及可能存在的重载方法。是一种新数据类型。1.函数句柄的创建nh_fun=fun %创建函数句柄nh_fun=str2func(fun) %创建函数句柄nh_array=str2func(fun1,fun2,) %创建函数句柄数组 其中fun是当前可访问函数当前可访问函数的函数名,h_fun是函数句柄,h_array是函数句柄数组4.5. 4.5. 函数句柄(续)函数句柄(续)2. 2.
28、 函数句柄基本用法函数句柄基本用法假设一个函数Funname的调用格式为:out1,out2,=Funname(in1,in2,)out1,out2,=Funname(in1,in2,)通过指令定义Funname的函数句柄:HfunHfun=FunnameFunname或HfunHfun=str2func(Funname)=str2func(Funname)定义Hfun之后通过函数句柄调用函数的格式为out1,out2,=feval(Hfun,in1,in2,)out1,out2,=feval(Hfun,in1,in2,) eval和feval指令都是用来执行字符串所代表的函数,优点在于可以在
29、运行中修改所执行的指令或参数,提高计算的灵活性。两者区别在于两者区别在于: eval所执行的字符串应该包括函数名、输入参数。 feval的Hfun字符串仅为函数名,输入参数由in1,in2,给出。例如下面的命令完成同样的操作eval(s=sin(pi/2)s=eval(sin(pi/2)s=feval(sin,pi/2)Hsin=sin;s=feval(Hsin,pi/2)4.5. 4.5. 函数句柄(续)函数句柄(续)3. 使用函数句柄的优点使用函数句柄的优点(1) (1) 在更大范围调用函数在更大范围调用函数 函数句柄包含了函数文件的路径和函数类型,即函数是否为内部函数、M或P文件、子函数、私有函数等,因此无论函数所在的文件是否在搜索路径上,是否是当前路径,是否是子函数或私有函数,只要函数句柄存在,函数就能执行。4.5. 4.5. 函数句柄(续)函数句柄(续)(2) (2) 提高函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年河北省退役军人事务厅下属事业单位招聘考试笔试试题【答案】
- 2025年农商银行反洗钱知识竞赛培训考试试题【答案】
- 项目日常管理制度
- 消防自然灾害应急救援预案
- 领导干部学习党的.教育实践活动心得体会
- 2025年涂镀产品:镀铝锌合作协议书
- 消防员辞职保证书
- 翔隆花园人货梯专项方案
- 湘艺版四年级上册音乐《卓玛》教案 (一)
- 2025年汽车内外饰件合作协议书
- 星巴克运营管理手册
- 六年级上册计算题专项练习1000题及答案
- 【室内设计手绘效果图表现技法】课件
- (完整版)中医适宜技术课件
- 中国古代的科学研究与思想启蒙
- 安徽茶叶市场分析报告
- 基恩士静电测量仪说明书
- 成都市第十二中学川大附中新初一分班英语试卷含答案
- 铁总物资〔2015〕117号:铁路建设项目甲供物资目录
- 八年级物理光学测试题含答案试题
- 人教版高中物理必修一全套课件【精品】
评论
0/150
提交评论