您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 实验2-M文件的编写、函数
实验2M文件及函数的编写注:不可能在有限的时间能将matlab的函数全部讲到。一边学习一边会接触一些新的函数。MATLAB语言特点:高度简洁,封装化一种解释型的编程语言“读一句,执行一句”效率不高,特别在遇到循环语句时程序运行时离不开MATLAB环境M文件及函数的编写M文件其实是一个像命令集一样的ASCII(纯文本)码文件。正是M文件的这个特点造就了MATLAB强大的可开发性和可扩展性。M文件的两种形式命令式(M_Script)函数式(Function)。命令式文件就是命令行的简单叠加,MATLAB会自动按顺序执行文件中的命令。函数式文件主要用以解决参数传递和函数调用的问题。M文件及函数的编写第一部分:M文件(可直接运行的文件)编写新建M文件编写指令调试运行一般过程用户在编制此类文件时,只需把所要执行的命令按行编辑到指定的文件中,程序运行时,MATLAB按行执行这些指令。M文件及函数的编写几点规则:●建立好的书写风格,保持程序的可读性。●m为文件的扩展名,在低版本的MATLAB中还要注意文件名不超过8位,文件名和变量的命名规则相同。●以符号%引导的行是注释行、不可执行,可供heIp命令查询;●不需要用end语句作为M文件的结束标志;M文件及函数的编写●在运行此函数之前,需要把它所在目录加到MATLAB的搜索路径上去或将文件所在目录设为当前日录。新版本会提示,老版本则出错。●运行一个程序,有多种方式。M文件及函数的编写●强烈要求:从本节课开始,后续同学们写的所有的程序和代码,都在m文件中写,运行。以便储存、修改、重复运行!!!不要在commanwindow中运行多条指令,避免出错,不便于修改与调试!!!MATLAB基本控制流forv=expression(表达式)commands(执行语勾)endfor循环语句的一般格式如下:(1)for循环结构循环变量一般为数组循环体成对出现M文件及函数的编写Whileexpression(条件式)statementsEnd(2)while循环结构成对出现M文件及函数的编写【例1】用循环求解s=0;fori=1:100s=s+i;ends=0;i=1;%初始化whilei=100s=s+i;i=i+1;end3.使用matlab函数直接对向量进行求和:M文件及函数的编写s=sum(1:100)函数名:example1_1.m1.使用for循环:2.使用while循环:【例2】用循环求解求最小的m,在这种情况下,最好用while.s=0;i=0;whiles=10000i=i+1;s=s+i;end[s,i]判断条件是什么?和小于10000时则一直累加M文件及函数的编写函数名:example2_2.miflogicalexpressionstatementsendiflogicalexpressionstatements1elsestatements2endiflogicalexpression1statements1elseiflogicalexpression2statements2elsestatements3end(3)if-else-end结构M文件及函数的编写为何要将第三种情况放在最后?【例3】编写M文件求A=[];%初始化为空矩阵fork=1:5forj=1:5ifk==jA(k,k)=5;elseifabs(k-j)==1A(k,j)=1;elseA(k,j)=0;endendendM文件及函数的编写函数名:example1_3.mSwitchexpressioncasecase_1(commands1)casecase_2(commands2)……casecase_k(commandsk)otherwise,(commands)end(4)分支语句switch-case-otherwise注意在执行过程中,只执行一个case后面的命令并跳出开关,程序在end后继续执行。M文件及函数的编写如下两个方法都能生成相同的数组y,但方法2的效率要高.方法1:按循环生成数组yfort=1:5000y(t)=sin(2*pi*t/10);end方法2:先生成数组y,Matlab的函数直接对数组进行运算,效率比方法1要优.t=1:10000;y=sin(2*pi*t/10);score=input('Pleaseinputyourscore:');ifscore=0&score60disp('Youmustworkharder!');elseifscore=60&score80disp('Notbad!');elseifscore=80&score90disp('Great!');elseifscore=90&score=100disp('Excellent!');elsedisp('Areyoukidding?');end【例4】演示if的程序,检测输入数据.函数名:example2_4.mM文件及函数的编写【例5】显示switch-case的程序。生成一个在[0,6]上的均匀分布的随机数,以此作为掷骰子出现的点数,出现1,3,5显示奇数,出现2,4,6显示偶数,出现0则显示错误.disp('Playdice,please!')%提示输入信息Num=round(6*rand)%利用round函数产生在[0,6]上服从均匀分布的随机数switchNumcase{1,3,5},disp('Odd')case{2,4,6},disp('Even')otherwise,disp('Youareout!')end函数名:example2_5.m3.交互式输入(1)用户输入提示命令inputinput命令用来接收用户从键盘输入数据、字符串或表达式,并接收输入值。其常用格式:运行此命今后,将给出文字提示,并等待键盘输入。输入的数字赋给变量R.(2)R=input(‘whatisyourname?’,’s’)运行此命令后,MATLAB将等待输入,并把输入当做字符串,赋给变量R。(1)R=input(‘Howmanyapples’)M文件及函数的编写Pause暂停程序等待回应;Pause(n)程序运行中等待n秒后继续运行;Pauseon显示其后的Pause命令,并且执行pause命令;Pauseoff显示其后的pause命令,但不执行该命令。(2)等待用户反应命令pause此命令用于使程序暂时终止运行,等待用户按任意键后继续运行。此函数的调用形式如下:M文件及函数的编写(3)中断命令breakbreak语句常常用在循环语句中。通过使用break语句,可不必等待循环的自然结束,而根据循环只设的条件来判断是否跳出循环。(4)等待键盘输入keyboard使程序进入暂时等待状态,但并没退出执行,可以修改参数,和运行其他指令等。(5)显示文字或数组dispM文件及函数的编写【【例例66】】输入三角形的三条边,求面积。输入三角形的三条边,求面积。运行:请输入三角形的三条边:[456]得面积:9.9216程序:triarea.m【【例例77】】穷举法的计算机实现穷举法的计算机实现在下面的4个算式中,每个方框表示一个非零数字,且任意两个数字互不相同,问(A)、(B)、(C)、(D)这四种情形分别有多少个解?+情形(C)、(D)无解。(A)、(B)实际上是同一个问题。-×÷(A)(B)(C)(D)计算机解法穷举法%程序的逻辑:n=0;%n用来记录解的个数fora=1:9forb=1:9forc=1:9ford=1:9fore=1:9forf=1:9forg=1:9forh=1:9fori=1:9如果a,b,c,d,e,f,g,h,i互不相等,且100*a+10*b+c+100*d+10*e+f=100*g+10*h+i,则输出这个解,并令n=n+1;end;end;end;end;end;end;end;end;end;endMATLAB程序:Example7.m第二部分:第二部分:MATLABMATLAB函数的编写函数的编写【例8】若最大值不为10000,需修改程序对m和10000值的设置,不适合于M-script.函数是MATLAB编程的主流方法除了函数外,还可以采用M-script文件M-script适合于小规模M文件及函数的编写(1)MATLAB(1)MATLAB语言的函数的基本结构语言的函数的基本结构若一个function作为一个M文件存储,切记其存储文件名应和函数名一样!(1)函数定义行(关键字function)function[out1,out2,..]=funcname(in1,in2,..)注释段输入返回变量的检测函数体语句•输入和输出(返回)的参数个数分别由nargin和nargout两个MATLAB保留的变量来给出。(2)第一行帮助行,以(%)开头,作为lookfor指令搜索的行M文件及函数的编写(3)函数体说明及有关注解以(%)开头,用以说明函数的作用及有关内容(4)函数体语句函数体内使用的除返回和输入变量这些在function语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除掉。如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。M文件及函数的编写【例8】前面的要求,m,10000•无需修改程序1.写好程序,存成findsum.m文件function[s,m]=findsum(k)s=0;m=0;while(s=k)m=m+1;s=s+m;end2.在commandwindow中调用:[s,m]=findsum(10000)M文件及函数的编写步骤:【例9】函数的递归调用:阶乘MATLAB函数为:functionk=my_fact(n)ifn1k=n*my_fact(n-1);elseifn==0|n==1k=1;elseerror('Uinputawrongparameter!')end2.在commandwindow中调用: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函数的函数名与存储名要一致。函数名首字符必须为字母。其后可为字母数字下划线等。长度小于31个字符。初学者请一个文件中只写一个函数。建议每个函数单独写成一个文件,由主程序调用,主程序不要写成函数形式(若写成函数形式,则所有变量都是内部变量,不会出现在workspace中)。函数编写注意事项:M文件及函数的编写【例10】写一个递归函数,计算行列式的值。函数定义为:detA=mydet(A),其中A为输入矩阵。(1)输入为长方阵时,输出结果为:“输入矩阵A必须是方阵!”;(2)输入为方阵时,输出该方阵的行列式;(3)将自己写的函数与matlab的内部函数det比较计算结果。计算结果一致才证明你自己的程序编写成功。该程序供已经学习了《线性代数》课程的同学学习。注:递归程序的核心是函数自己调用自己,未出现的计算结果调用已经出现的计算结果。本题实现递归调用的关键是元素a(i,j)的余子式M(i,j),也是一个n-1阶的行列式。函数:mydet.m在commandwindow中运行:定理1行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和,即回忆:行列式按行(列)展开法则nnnjninijinjnjaaaaaaaaaaaaD11222111111iA+…+ijA+…+inAijaina则D=1ia(i=1,2,3…n)or1122(1,2,,)jjjjnjnjDaAaAaAjn程序设计的优化程序设计的优化虽然MATLAB程序语言高度集成,但由于MATLAB属于解释型语言,在执行效率方面还是存在
本文标题:实验2-M文件的编写、函数
链接地址:https://www.777doc.com/doc-3988635 .html