




已阅读5页,还剩79页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章详细讲解利用M语言进行编程的方法讲述的主要内容:脚本文件流程控制函数文件子函数M文件的调试,实训六MATLAB编程基础(二),MATLAB编程基础(续),6.1概述6.2脚本文件6.3流程控制6.4函数文件6.5M文件调试6.6M文件性能分析,6.4函数文件,M语言函数文件能够接受用户的输入参数,进行计算,并将计算结果作为函数的返回值返回给调用者在MATLAB中具有不同类型的函数文件内建函数文件系统M函数文件系统MEX函数文件用户自定义MEX函数文件用户自定义的M函数文件,函数文件(续),MATLAB的内建函数文件MATLAB自定义的函数文件称内建函数文件。调用内建函数的方法:使用函数名并给出相应的输入、输出参数即可。例如:sin.m函数调用格式:y=sin(x)例:x=0:2*pi/180:2*pi;y=sin(2*x);plot(x,y),用户自定义的M函数文件是由用户自己利用M语言编写的文件系统M函数文件是由MATLAB提供的M语言函数文件,函数文件(续),本节介绍6.4.1基本结构6.4.2输入输出参数6.4.3子函数6.4.4局部变量和全局变量6.4.5函数执行规则,函数文件(续),M语言函数文件具有下面的不同部分函数定义行在线帮助注释行M语言代码,6.4.1基本结构,函数m文件的格式:function返回变量=函数名(输入变量)注释说明语句段程序语句段特定规则:1)函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:function=()2)程序中的变量均为局部变量,不保存在工作空间中,其变量只在函数运行期间有效。,基本结构(续),001functiony=average(x)002%AVERAGE求向量元素的均值003%语法:004%Y=average(X)005%其中,X是向量,Y为计算得到向量元素的均值006%若输入参数为非向量则出错007008%代码行009m,n=size(x);010%判断输入参数是否为向量011if(m=1)|(n=1)|(m=1,例函数文件示例,函数定义行001functiony=average(x)包括关键字function函数输出参数y函数名称average函数输入参数x函数名称定义要求必须以字符开头,后面可以用字符、数字和下划线的组合构成函数名称MATLAB对函数名称的长度有限定函数的M文件名称最好和函数名称保持一致,若不一致,则调用函数时需要使用文件名称而非函数名称。,基本结构(续),在线帮助M函数文件的在线帮助为紧随在函数定义行的注释行002%AVERAGE求向量元素的均值003%语法:004%Y=average(X)005%其中,X是向量,Y为计算得到向量元素的均值006%若输入参数为非向量则出错,基本结构(续),若在MATLAB命令行窗口中键入指令helpaverage则helpaverageAVERAGE求向量元素的均值语法:Y=average(X)其中,X是向量,Y为计算得到向量元素的均值若输入参数为非向量则出错,基本结构(续),注释行008%代码行010%判断输入参数是否为向量012%若输入参数不是向量,则出错015%计算向量元素的均值注释行不会显示在在线帮助中,主要原因是这些注释行没有紧随在H1帮助行的后面,基本结构(续),M语言代码008%代码行009m,n=size(x)010%判断输入参数是否为向量011if(m=1)|(n=1)|(m=1ifm=1m=n;end%Averageavg=sum(x)/m;%Sandaddeviationstdev=sqrt(sum(x.2)/m-avg.2);%Ranks=svd(x);r=sum(stol);,输入输出参数(续),运行A=123;456A=123456a,s,r=outstats(A,0.1)a=2.50003.50004.5000s=1.50001.50001.5000r=2outstats(A,0.1)ans=2.50003.50004.5000,输入输出参数(续),a,s=outstats(A,0.1)a=2.50003.50004.5000s=1.50001.50001.5000,调用该函数时,将输出参数依次写在一个向量中,若输出参数的个数等于指定的输出参数个数时,计算结果依次赋值给不同的变量。若输出参数的个数小于函数定义的输出参数个数时,将计算得到的前几个输出参数作为返回值。,运行A=123;456A=123456a,s,r=outstats(A,0.1)a=2.50003.50004.5000s=1.50001.50001.5000r=2outstats(A,0.1)ans=2.50003.50004.5000,输入输出参数(续),a,s,r,t=outstats(A,0.1)?,运行A=123;456A=123456a,s,r=outstats(A,0.1)a=2.50003.50004.5000s=1.50001.50001.5000r=2outstats(A,0.1)ans=2.50003.50004.5000,输入输出参数(续),a,s,r,t=outstats(A,0.1)?Errorusing=outstatsToomanyoutputarguments.a,s,r=outstats(A,0.1,1)?Errorusing=outstatsToomanyinputarguments.,若输出参数的个数大于函数定义的输出参数个数时,将提示出错。,若输入参数的个数大于函数定义的输入参数个数时,将提示出错。,输入输出参数(续),控制输入输出参数的个数还有一些方法:函数nargin用来获取当前调用函数时给定的输入参数个数函数nargout用来获取当前调用函数时给定的输出参数个数函数varargin用来获取当前调用函数时可变的输入参数个数函数varargout用来获取当前调用函数时可变的输出参数个数,例nargout和nargin示例functionc=testarg(a,b)%TESTARG检测输入输出参数个数%该函数根据不同的输入输出参数个数进行相应的操作if(nargout=1)disp(使用该函数必须指定一个输出参数!);returnendswitchnargincase0disp(使用该函数必须指定一个输入参数!);c=;returncase1c=a.2;case2c=a+b;end,输入输出参数(续),函数nargin用来获取函数的输入参数个数函数nargout用来获取函数输出函数个数,运行例4-15A=123;B=235;testarg(A,B)使用该函数必须指定一个输出参数!C=testarg(A,B)C=358C=testarg使用该函数必须指定一个输入参数!C=C=testarg(A)C=149C=testarg(A,B,C)?Errorusing=testargToomanyinputarguments.,输入输出参数(续),MATLAB的M函数文件还可以具有个数不确定的输入、输出参数在定义M函数文件时,不指明输入、输出参数的个数,而是在程序中通过编写程序完成具体参数的确定完成该功能主要依靠varargin和varargout函数当函数的定义具有以下形式时functiony=function_name(varargin)函数function_name可以接受任意个数的输入参数使用varargin函数接受M函数参数时,将用户输入的所有参数构建成为一个元胞数组,该元胞数组中的元素为用户输入的参数当函数的定义具有以下形式时functionvarargout=function_name(n)函数function_name可以输出任意个数的输出参数使用varargout函数输出M函数参数时,需要将所有必要的输出参数传递给元胞数组,在传递参数时,还需要注意参数的顺序,输入输出参数(续),例不确定的输入参数个数functiony=varargin_example(varargin)%VARARGIN_EXAMPLE不确定输入参数例子str=sprintf(输入参数的个数:=%d,length(varargin);disp(str);y=0;%varargin的类型class(varargin)fori=1:length(varargin)%varargin为元胞数组if(isnumeric(varargini)%将每个为数值数组的输入参数的第一个元素累加求和y=y+varargini(1);endend,输入输出参数(续),运行不确定的输入参数个数varargin_example输入参数的个数:=0ans=cellans=0varargin_example(a,123,3,rand(2,5)输入参数的个数:=4ans=cellans=4.6154,输入输出参数(续),class(varargin),class(varargin),y=y+varargini(1),例不确定的输出参数个数functionvarargout=varargout_example(varargin)%VARARGOUT_EXAMPLE不确定个数的输出参数%判断输出参数的个数%下面注释行中的代码执行有错误%str=sprintf(输出参数的个数=%d,length(varargout);%必须使用nargoutstr=sprintf(输出参数的个数:=%d,nargout);disp(str);if(nargoutab=varargout_example(3,4,5,9)输出参数的个数:=2a=9b=5,输入输出参数(续),if(nargoutx=1:11;mean,mid=newstats(x)mean=6mid=6x=1:10;a,b=newstats(x)a=5.5000b=5.5000,子函数(续),helpnewstatsNEWSTATS计算均值和中间值helpnewstatsmedian计算中间值,子函数(续),functionavg,med=newstats(u)%NEWSTATS计算均值和中间值n=length(u);avg=mean(u,n);med=median(u,n);functiona=mean(v,n)%计算平均值a=sum(v)/n;functionm=median(v,n)%计算中间值w=sort(v);ifrem(n,2)=1m=w(n+1)/2);elsem=(w(n/2)+w(n/2+1)/2;end,局部变量:在M函数内部声明并使用的变量只在本函数范围内有效仅能在函数调用执行期间被使用,一旦函数结束运行,则变量占用的内存空间自动释放,变量的数值也不存在了例局部变量的例子functionlocal%LOCAL察看局部变量的例子x=rand(2,2);y=zeros(2,2);z=函数中的变量;u=x,y,z;disp(z)whos,6.4.4局部变量和全局变量,运行局部变量的例子local函数中的变量NameSizeBytesClassu1x3256cellarrayx2x232doublearrayy2x232doublearrayz1x612chararrayGrandtotalis31elementsusing332byteswhos,全局变量:在函数之外定义的变量可以为本文件中其他函数所共用MATLAB将全局变量保存在特殊的工作空间进行统一维护、管理将变量声明为全局变量的方法在使用变量前,用关键字global声明例:声明全局变量XYglobalXYwhosNameSizeBytesClassXY0 x00doublearray(global)Grandtotalis0elementsusing0bytes,局部变量和全局变量(续),使用global关键字创建全局变量时有三种情况若声明为全局的变量在当前空间和全局空间都不存在,则创建一个新的变量,然后为这个变量赋值为空数组,该变量同时存在于局部工作空间和全局工作空间若声明为全局的变量已经存在于全局空间中,则不会在全局工作空间创建新的变量,其数值同时赋值给局部工作空间中的变量若声明为全局的变量存在于局部工作空间中,而全局工作空间不存在,则系统会提示一个警告信息,同时将局部的变量复制到全局工作空间中,局部变量和全局变量(续),例全局变量的例子%创建全局变量globalmyx%察看全局变量的信息whosNameSizeBytesClassmyx0 x00doublearray(global)Grandtotalis0elementsusing0byteswhosglobalNameSizeBytesClassmyx0 x00doublearray(global)Grandtotalis0elementsusing0bytes,局部变量和全局变量(续),若声明为全局的变量在当前空间和全局空间都不存在,则创建一个新的变量,然后为这个变量赋值为空数组,该变量同时存在于局部工作空间和全局工作空间,例全局变量的例子(续)%给全局变量赋值myx=10myx=10%察看全局变量的信息whosNameSizeBytesClassmyx1x18doublearray(global)Grandtotalis1elementusing8byteswhosglobalNameSizeBytesClassmyx1x18doublearray(global)Grandtotalis1elementusing8bytes,局部变量和全局变量(续),其数值同时赋值给局部工作空间中的变量,例全局变量的例子(续)myy=10myy=10whosNameSizeBytesClassmyy1x18doublearrayGrandtotalis1elementusing8byteswhosglobal,局部变量和全局变量(续),若声明为全局的变量存在于局部工作空间中,而全局工作空间不存在,则系统会提示一个警告信息,同时将局部的变量复制到全局工作空间中,globalmyyWarning:Thevalueoflocalvariablesmayhavebeenchangedtomatchtheglobals.FutureversionsofMATLABwillrequirethatyoudeclareavariabletobeglobalbeforeyouusethatvariable.whosNameSizeBytesClassmyy1x18doublearray(global)Grandtotalis1elementusing8byteswhosglobalNameSizeBytesClassmyy1x18doublearray(global)Grandtotalis1elementusing8bytes,例全局变量的例子(续)%清除变量clearmyx%察看信息whoswhosglobalNameSizeBytesClassmyx1x18doublearray(global)Grandtotalis1elementusing8bytes,局部变量和全局变量(续),只是将局部工作空间中的变量清除,例全局变量的例子(续)%在局部工作空间再次创建变量myx=23myx=23%察看变量的信息whosNameSizeBytesClassmyx1x18doublearrayGrandtotalis1elementusing8bytes,局部变量和全局变量(续),例全局变量的例子(续)%将其修改为全局变量globalmyxWarning:Thevalueoflocalvariablesmayhavebeenchangedtomatchtheglobals.FutureversionsofMATLABwillrequirethatyoudeclareavariabletobeglobalbeforeyouusethatvariable.%察看变量的数值myxmyx=10,局部变量和全局变量(续),注意:在此例中将局部变量转变为全局变量的过程中原来的局部变量的数值丢失了,例全局变量的例子(续)%清除当前的工作空间clearwhoswhosglobalNameSizeBytesClassmyx1x18doublearray(global)Grandtotalis1elementusing8bytes%清除所有的工作空间clearallwhoswhosglobal,局部变量和全局变量(续),当用户在MATLAB命令行窗口键入一条命令或者执行M语言文件中包含的一条语句或者指令时,MATLAB解释器就负责解析用户的输入,并且给出相应的答案MATLAB解释器解析命令按照一定的优先级进行首先判断输入的命令是否为变量若不是内存中的变量,判断输入的命令是否为MATLAB的内建函数若不是内建函数,则判断输入的命令是否为子函数若在同一个路径下发现同名的三种类型的文件MEX文件、P代码文件和M代码文件,则优先执行MEX文件,其次是P代码文件,最后执行的是M语言文件,6.4.5函数执行规则,例MATLAB命令解析的优先级sin=Thisisastring!sin=Thisisastring!sin(3)ans=iwhichsinsinisavariable.clearallsin(3)ans=0.1411whichsinsinisabuilt-infunction.,函数执行规则(续),若需要了解具体调用的是哪一个对象,则可以使用which命令获取相应的信息,MATLAB编程基础(续),6.1概述6.2脚本文件6.3流程控制6.4函数文件6.5M文件调试6.6M文件性能分析,6.5M文件调试,M文件的调试可以在文件编辑器中进行M语言的文件编辑器不仅仅是一个文件编辑器,还是一个可视化的调试开发环境可以在命令行中结合具体的命令进行,6.5M文件调试,一般调试过程条件断点错误断点命令行调试,6.5.1一般调试过程,应用程序的错误语法错误包括词法或者文法的错误运行时的错误指程序运行过程中得到的结果不是用户需要的结果程序的调试是在程序无法得到正确结果时进行程序修正的唯一手段M文件是一种解释型语言,只有在运行过程中才能发现应用程序的错误,从MATLABRelease14即MATLAB7.0开始,如果程序运行过程中出现错误,则在MATLAB命令行窗体提示信息中,以超链接的方式来显示出现错误的代码行位置,用户只要单击超链接,则可以打开M语言编辑器,并且自动定位到出现错误的代码。M语言编辑器既是M语言的文本编辑器,同时也是调试的可视化环境,在M语言编辑器下Debug菜单中的命令就能够完成程序调试的所有功能,默认情况下,大部分命令都是用来设置各种断点,只有设置了断点的应用程序才能够进行调试。,6.5.1一般调试过程,6.5.1一般调试过程,在MATLAB中,程序断点主要分为三类:n标准断点。n条件断点。n错误断点。,6.5.1一般调试过程,这些断点的设置都可以通过M语言编辑器下的Debug菜单中相应的菜单命令来创建,如下图所示。,6.5.1一般调试过程,例M文件调试代码stats_error.m001functiontotalsum,average=stats_error(input_vector)002%STATS_ERROR-Calculatescumulativetotal,6.5.1一般调试过程,在MATLAB命令行窗体中尝试执行上面的函数:sumavg=stats_error(rand(1,50)?Undefinedfunctionorvariableinput_vector.Errorin=stats_errorourmeanat12y=sum(input_vector)/m;Errorin=stats_errorat4average=ourmean(input_vector);,MATLAB首先提示程序运行有错误,并且指出错误发生的地点,单击Errorin后面的超链接(具有下划线文字的),可以直接在M语言编辑器中打开相应的M代码文件,并且光标会停留在相应的代码行。,6.5.1一般调试过程,这时,可以尝试几种不同的设置断点的方法,因为这里的示例代码在执行过程中出现了错误,可以设置错误断点,也可以直接在出现错误的代码行处设置标准断点。由于在前面的操作中,已经自动定位到了出现错误的代码行,故选择设置标准断点是比较好的选择。设置标准断点的方法如下:,6.5.1一般调试过程,在M语言编辑器打开代码stats_error.m,将光标置于代码的第12行,然后执行Debug菜单下的Set/ClearBreakpoint菜单命令。直接使用快捷键F12。用鼠标直接单击代码行左侧编辑器上的短横线通过M语言编辑器工具栏上的按钮来设置标准断点。此时将在出现错误的代码行(也就是代码的第12行)设置断点,设置断点处用红色的圆点标识,如图4-6所示。,6.5.1一般调试过程,图4-6设置断点,6.5.1一般调试过程,设置好断点之后,再次在MATLAB命令行中运行函数,这次运行MATLAB不会报告代码运行错误,而是进入到调试状态:sumavg=stats_error(rand(1,50)12y=sum(input_vector)/m;K进入到调试状态后,MATLAB的命令行窗体中会显示当前断点的代码行,并且命令行窗体提示符变成“K”,表示当前MATLAB的状态为调试状态。,6.5.1一般调试过程,此时,在M文件编辑器中第12行代码前有绿色的箭头,表示当前程序运行在此处中断,如图4-7所示。,图4-7M语言编辑器的调试模式,6.5.1一般调试过程,另外,部分按钮从编辑状态进入调试状态,如图4-8所示。,图4-8调试程序的按钮,增加断点清除断点单步执行(Step)进入函数(Stepin)跳出函数(Stepout)运行(Run)退出调试模式,6.5.1一般调试过程,通过M语言编辑器用户界面中的Stack下拉列表框可以了解当前应用程序使用堆栈的状态,例如本例子中Stack下拉列表框包含ourmean,stats_error和Base,它们由下至上,分别为调用者和被调用者之间的关系,同时也显示了当前的工作空间。,6.5.1一般调试过程,此时在MATLAB命令行窗体的“K”提示符下,可以任意键入MATLAB指令进行运算和处理,不过需要注意,此时执行指令的MATLAB工作空间就是当前Stack下拉列表框中选择的那个工作空间。例如,当Stack下拉列表框为ourmean时,在MATLAB命令行窗体下键入指令:KwhosNameSizeBytesClassm1x18doublearrayn1x18doublearrayx1x50400doublearray再来看看调用函数时,MATLAB命令行窗体显示的错误信息:?Undefinedfunctionorvariableinput_vector.,6.5.1一般调试过程,可以看到,当前的工作空间下没有变量名input_vector,这也是该程序执行出错的原因,将程序中第12行的input_vector修改成为x就能得到正确的答案了。注意:如果需要修改代码,一定要退出调试模式。如果不退出调试模式而修改了代码,在保存代码时,MATLAB将提示用户,如下图所示。,6.5.1一般调试过程,退出调试模式直接执行Debug菜单下的ExitDebugMode菜单命令单击M语言编辑器上的按钮在调试模式的K提示符下键入指令dbquit清除设置好的断点先将光标设置在有断点的代码行,再执行Debug菜单下的Set/ClearBreakpoint命令单击M语言编辑器上的按钮通过Debug菜单下的ClearAllBreakpointsinAllFiles,把当前编辑器的所有M文件中的断点清除执行clearall指令也可以清除断点,6.5.2条件断点,所谓条件断点,就是当代码执行过程中,代码的某个条件满足时再进入到调试模式。这种条件断点对于调试那些循环结构代码时非常有效,因为循环体内的代码很有可能是在循环的某个阶段才出现错误,也就是说,当循环变量达到某个数值时才出现错误。,6.5.2条件断点,使用下面例子的代码演示设置条件断点的方法。(tjdd.m)001sum=0;002fori=1:1000003sum=sum+i;004end005str=Theresult:,num2str(sum);006disp(str)条件断点其实可以设置在代码的任意行,只要能够满足相应的条件就会中断当前程序执行进入到调试模式,这里将断点设置在循环体内,也即是代码的003行。首先,把光标放置在需要设置断点的代码行,然后执行M语言编辑器中Debug菜单下的Set/ModifyConditionBreakpoint菜单命令,此时将弹出断点设置对话框,如图4-10所示。,6.5.2条件断点,图4-10设置条件断点,在对话框中设置条件变量,当满足相应的条件就会中断当前程序执行进入到调试模式。在对话框中提示用户相应的条件将在执行该行代码之前被检测,如果满足,则立即进入到调试状态。,6.5.3错误断点,所谓错误断点,就是在程序执行过程中,如果出现了错误或者警告信息,则自动中断当前程序执行,并且进入到调试模式下。由于这种断点是在程序执行出现错误的时候自动实现程序中断,并且进入调试模式,所以又叫做自动断点。设置错误断点,需要执行M语言编辑器中Debug菜单下的StopifErrors/Warnings命令,此时将弹出用于完成错误断点设置的对话框。在对话框中分别针对错误、Try-catch结构、警告以及Nan和Inf的情况进行设置。,6.5.3错误断点,设置错误断点的对话框内容比较简单,例如针对错误情况设置断点的属性页,如图4-11所示。,图4-11针对错误发生情况设置错误断点,6.5.3错误断点,其中Usemessageidentifiers选项允许针对特定的错误情况来设置错误断点,当选择这个选项之后单击Add按钮,并在弹出的对话框增加错误信息的标识,如图4-12所示。,图4-12增加错误信息标识,6.5.3错误断点,其中Usemessageidentifiers选项允许针对特定的错误情况来设置错误断点,当选择这个选项之后单击Add按钮,并在弹出的对话框增加错误信息的标识,如图4-12所示。,图4-12增加错误信息标识,MATLAB会为每一种错误信息定义一个错误标识,用户也可以针对自己的应用程序自定义错误标识。,6.5.3错误断点,其中Usemessageidentifiers选项允许针对特定的错误情况来设置错误断点,当选择这个选项之后单击Add按钮,并在弹出的对话框增加错误信息的标识,如图4-12所示。,图4-12增加错误信息标识,MATLAB会为每一种错误信息定义一个错误标识,用户也可以针对自己的应用程序自定义错误标识。,错误断点一旦设置,对整个MATLAB会话期间都会有效。,6.5.4命令行调试,应用与调试M文件的指令,MATLAB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通局文明客运工作方案2篇
- 公司安全部门管理制度
- 公司行管人员管理制度
- 河北承德市高新区2024-2025学年高二下册期中考试数学试卷附解析
- 广东省湛江市2023−2024学年高二下册期末考试数学试卷附解析
- 2025年中考语文(长沙用)课件:主题16 一路生花毕业纪念活动
- 劳动法律服务与数字化平台研究-洞察阐释
- 2024年黔南州荔波县“特岗计划”教师招聘真题
- 2024年珲春市事业单位招聘真题
- 殡仪馆可行性研究报告
- 2025年北京丰台区九年级中考二模英语试卷试题(含答案详解)
- 《活着》读书分享优秀课件
- 《中国近代史纲要》社会实践作业
- 中兴项目管理初级认证VUE题库(含答案)
- 三年级上册第一单元习作课件
- 中医药膳学:中医药膳制作的基本技能课件
- 往来款项明细表-A4
- 甘肃省人力资源服务机构
- 饰面板安装工程检验批质量验收记录
- 北京市科技计划项目(课题)验收(结题)管理细则(试行)
- 路基交验具体要求(共5页)
评论
0/150
提交评论