您好,欢迎访问三七文档
1第6章M文件比较简单的问题,特别是一次性简单问题,从指令窗中直接输入指令进行计算是十分轻松的事。但随指令数的增加,或随控制流复杂度的增加,或重复计算要求的提出,直接从指令窗进行计算就显得烦琐。此时就需要将程序放进M文件中,这种程序的扩展名为.m。6.1MATLAB控制流MATLAB用于程序流控制的指令与其它语言相应指令的用法十分相似。6.1.1if-else-end条件控制if-else-end指令为程序流提供了一种分支控制。表6.1-1if-else-end分支结构的使用方式单分支双分支多分支ifexpr(commands)endifexpr(commands1)else(commands2)endifexpr1(commands)elseifexpr2(commands)…….else(commandsk)end当expr给出“逻辑1”时,(commands)指令组才被执行。当expr给出“逻辑1”时,(commands1)指令组被执行;否则,(commands2)被执行。expr1,expr2,…中,首先给出“逻辑1”的那个分支的指令组被执行;否则,(commandsk)被执行。该使用方法常被switch-case所取代。注:1.expr通常是关系、逻辑运算构成的表达式。也可以是一般代数表达式,此时给出的任何非零值的作用等同于“逻辑1。2.当expr给出数组时,仅当数组元素不包含任何零元素时,该expr控制的分支才执行。补充:逻辑运算符,不等于为“~=”,判断等于为“==”,或为“|”,非为“~”,且为“&”6.1.2switch-case控制结构表6.1-2switch-case控制结构的使用方式指令格式含义switchexprcasevalue_1(commands1)casevalue_2(commands2)expr为根据此前给定变量进行计算的表达式value_1是给定的数值、字符串标量(或胞元数组,见附录A.2)若expr结果与value_1(或其中的胞元元素)相等,则执行。2casevalue_k(commandsk)otherwise(commands)endvalue_k是给定的数值、字符串标量(或胞元数组)若expr结果与value_k(或其中的胞元元素)相等,则执行。该情况是以上的“并”的“补”若所有case都不发生,则执行该组命令。6.1.3for循环和while循环表6.1-3循环结构的使用方式for循环while循环forix=array(commands)endwhileexpression(commands)end注:for循环的次数确定,while循环的次数不确定。【例3.3-1】欧姆定律:iur,其中iur,,分别是电阻(欧姆)、电压(伏特)、电流(安培)。验证实验:据电阻两端施加的电压,测量电阻中流过的电流,然后据测得的电压、电流计算平均电阻值。(测得的电压电流具体数据见下列程序)。(1)非向量化程序clearvr=[0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41];ir=[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];%--------------------L=length(vr);fork=1:Lr(k)=vr(k)/ir(k);end%---------------------------sr=0;fork=1:Lsr=sr+r(k);endrm=sr/Lrm=30.5247(2)向量化程序clearvr=[0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41];ir=[0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345];r=vr./ir%相同位置元素进行运算rm=mean(r)%MATLAB现成的函数,查阅方法r=Columns1through731.785730.000030.900029.448330.678029.883730.0669Columns8through1030.817131.493530.1739rm=30.52473【例6.1-4】编写计算NnnkkS111,其中NkkN11minarg,是预先给定的控制精度。(1)编写M函数文件exm060104.mfunction[S,N]=exm060104(epsilon)%[S,N]=exm060104(epsilon)%CalculatethesumofaspecialseriesS=1+1/(1+2)+…+1/(1+2+…+N)%SSumofaspecialseries%NTheminimumamongallnumberstohave1/sum(1:N)epsilon%epsilonGivenaccuracyk=0;s=0;d=inf;S=0;whiledepsilonk=k+1;s=s+k;d=1/s;S=S+d;endN=k;(2)把文件exm060104.m保存在处于MATLAB搜索路径上的文件夹中。(3)运行以下指令,控制精度取0.0001。[S,N]=exm060104(0.0001)S=1.9859N=1416.1.4控制程序流的其它常用指令表6.1-4控制程序流的其它常用指令指令及使用格式使用说明v=input('message')v=input('message','s')该指令执行时,“控制权”交给键盘;待输入结束,按下Enter键,“控制权”交还MATLAB。message是提示用的字符串。第二种格式,不管键入什么,总以字符串形式赋给变量v。keyboard遇到keyboard时,将“控制权”交给键盘,用户可以从键盘输入各种MATLAB指令。仅当用户输入return指令后,“控制权”才交还给程序。breakbreak指令,或导致包含该指令的while、for循环终止,或导致if-end,switch–case等中断。continue跳过位于它之后的循环体中其它指令,而执行循环的下一个迭代。pausepause(n)第一种格式使程序暂停执行,等待用户按任意键继续;第二种格式使程序暂停n秒后,再继续执行。return结束return指令所在函数的执行,而把控制转至主调函数或者指令窗。否则,只有待整个被调函数执行完后,才会转出。46.2脚本文件和函数文件比较简单的问题,一次性问题,通过指令窗中一组指令去求解所需的指令较多和所用指令结构较复杂或当一组指令通过改变少量参数就可以被反复使用去解决不同问题时,直接在指令窗中输入指令的方法就显得烦琐和笨拙。解决办法:应用M文件,包含:M脚本文件和M函数文件6.2.1Editor/DebuggerM文件编辑/调试器简介M文件编辑器的启动6.2.2M脚本文件编写初步【例1.8-1】编写解算例1.3-10题目的M脚本文件,并运行之。t=0:pi/50:4*pi;%定义自变量t的取值数组y=exp(-t/3).*sin(3*t);%计算与自变量相应的y数组。注意:乘法符前面的小黑点。plot(t,y,'-r','LineWidth',2)%绘制曲线axis([0,4*pi,-1,1])xlabel('t'),ylabel('y')〖说明〗(1)当使用M文件编辑调试器保存文件时,或当在MATLAB指令窗中运行M文件时,不必写出文件的扩展名。在M文件编辑调试器中,可以采用汉字注释,并总可获得正确显示。(2)该文件中的指令形式和前后位置,与解决同一个问题时在指令窗中输入的那组指令没有任何区别。(3)MATLAB在运行这个脚本时,只是简单地从文件中读取那一条条指令,送到MATLAB中去执行。(4)文件扩展名是“.m”。(5)与在指令窗中直接运行指令一样,脚本文件运行产生的变量都是驻留在MATLAB基本工作空间(baseworkspace)中。只要用户不使用clear指令加以清除,或MATLAB指令窗不关闭,这些变量将一直保存在基本工作空间中。基本工作空间随MATLAB的启动而产生;只有当关闭MATLAB时,该基本空间才被删除。6.2.3M函数文件与脚本文件不同,函数文件(Functionfile)犹如一个“黑箱?”。从外界只看到:传给它的输入量和送出来的计算结果,而内部运作从外界看是藏而不见的。函数文件运行时分配临时的函数工作空间。6.2.4局部变量和全局变量(1)局部(Local)变量存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于5该函数本身。正由于这种空间、时间上的局部性,中间变量被称为局部变量。(2)全局(Global)变量通过global指令,MATLAB也允许几个不同的函数空间以及基本工作空间共享同一个变量。这种被共享的变量称为全局变量。全局变量损害函数的封装性,不提倡使用。6.2.5M函数文件的一般结构【例6.2-1】(1)编写M函数文件exm060201.m(MATLAB以保存文件名为准,函数文件名必须以字母开头,后面可以是字母、下划线以及数字的任意组合。)function[S,L]=exm060201(N,R,str)%函数声明行,必不可少,脚本文件无此行。%exm060201.mTheareaandperimeterofaregularpolygon(正多边形的面积和周长),H1行%NThenumberofsidesH1行及其之后的所有注释行构成整个在线帮助文本区%RThecircumradius%strAlinespecificationtodeterminelinetype/color%STheareaoftheregularpolygon%LTheperimeteroftheregularpolygon%exm060201用蓝实线画半径为1的圆%exm060201(N)用蓝实线画外接半径为1的正N边形%exm060201(N,R)用蓝实线画外接半径为R的正N边形%exm060201(N,R,str)用str指定的线画外接半径为R的正N边形%S=exm060201(...)给出多边形面积S,并画相应正多边形填色图%[S,L]=exm060201(...)给出多边形面积S和周长L,并画相应正多边形填色图%ZhangZhiyong编写于2015-3-9第8版编写和修改记录,用于软件档案管理switchnargin%函数体,必不可少。case0N=100;R=1;str='-b';%正100边形-近似为圆case1R=1;str='-b';case2str='-b';case3;%不给出任何变量操作otherwiseerror('输入量太多。');end;t=0:2*pi/N:2*pi;x=R*sin(t);y=R*cos(t);ifnargout==0plot(x,y,str);elseifnargout2error('输出量太多。');elseS=N*R*R*sin(2*pi/N)/2;%多边形面积L=2*N*R*sin(pi/N);%多边形周长fill(x,y,str)endaxisequalsquareboxon6shg(2)把exm060201.m文件保存在MATLAB的搜索路径上,然后在指令窗中运行以下指令。[S,L]=exm060201(6,2,'-g')%计算外接半径为2的正六边形面积和周长,并绘图。S=%允许使用比标称数目少的输入/输出量10.3923L=12.0000-2-1.5-1-0.500.511.52-2-1.5-1-0.500.511.52注意:1.从结构上看,脚本文件只是比函数文件少一个“函数声明行”。2.观察临时函数工作空间(functionworkspace);
本文标题:ch6-M文件
链接地址:https://www.777doc.com/doc-5493723 .html