《第8章MATLAB程序设计》由会员分享,可在线阅读,更多相关《第8章MATLAB程序设计(69页珍藏版)》请在金锄头文库上搜索。
1、第第8章章 MATLAB程序设计程序设计 Matlab技术技术lMATLAB作为一种应用广泛的科学计算软件,不仅具有强大的数值计算、数据可视化功能,而且具有强大的程序设计功能。通过编写扩展名为.m的M文件,用户可以实现各种复杂的功能,且MATLAB语言语法简单,库函数丰富,程序易于调试,极大方便了用户的开发过程。本章主要介绍MATLAB中的M文件,函数定义、类型、参数传递方法,程序控制结构,文件操作,代码优化方法和程序调试方法等。Matlab技术技术l【学习目标】l掌握MATLAB中脚本M文件和函数M文件的概念。l掌握MATLAB中函数变量类型、函数参数传递方法、函数类型、函数句柄。l掌握MA
2、TLAB中的程序流程控制语句。l掌握MATLAB中的代码优化方法。l掌握MATLAB中的程序调试方法。Matlab技术技术8.1 M文件文件lMATLAB编写的程序文件称为M文件,M文件有脚本M文件和函数M文件两种,脚本M文件是一串按用户意图排列而成的MATLAB命令集合,不包含输入参数,也不输出参数。脚本M文件运行后,所产生的所有变量都驻留在MATLAB基本工作空间中,只要用户不使用clear命令清除,且MATLAB命令窗口不关闭,这些变量将一直保存在MATLAB基本工作空间中。基本工作空间随MATLAB的启动而启动,只有关闭MATLAB时,该基本工作空间才被删除。Matlab技术技术l函数
3、包含输入变量和输出变量,具有自己的函数工作空间,函数运行时获取传递给它的变量,并返回结果给输出变量。函数内所创建的变量只驻留在函数工作空间,而且只在函数执行期间临时存在,在函数运行结束时消失。l脚本M文件不包含输入参数和输出参数,通常由M文件正文和注释部分构成。文件正文主要实现特定功能,而注释是给出代码说明,便于阅读。Matlab技术技术l函数M文件的第一行以function开始,说明此文件是一个函数。函数使用下述语法进行定义:lfunctionout1,out2,.=funname(in1,in2,.)l其中函数名必须以字母开始,其后可以为字母、数字或者下划线,函数名不能超过规定的长度,超过
4、的部分将会被忽略。可使用函数isvarname判断函数名是否有效。lisvarnamefunMatlab技术技术l函数输出参数包含在中括号中,输入参数包含在小扩号中,函数输出参数包含在中括号中,输入参数包含在小扩号中,并使用逗号分开多个输入输出参数。l下面的语句定义了一个sphere函数,包括三个输入参数和三个输出参数。lfunctionx,y,z=sphere(theta,phi,rho)l函数可以有零个或多个输入参数和输出参数有零个或多个输入参数和输出参数,如果没有输出参数,可忽略中括号或者使用空中括号表示。lfunctionprintresults(x)lfunction=printre
5、sults(x)l函数可以按少于函数函数可以按少于函数M中所规定的输入和输出参数进行调用,中所规定的输入和输出参数进行调用,但不能多于函数但不能多于函数M中所规定的输入和输出参数数目。中所规定的输入和输出参数数目。如果输入和输出参数数目多于函数中function语句所规定的数目,则调用时自动返回一个错误提示。Matlab技术技术l【例8-1】脚本M文件l%petal.ml%AnM-filescripttoproduceflowerpetalplotsltheta=-pi:0.01:pi;%产生一维矢量lrho(1,:)=2*sin(5*theta).2;lrho(2,:)=cos(10*the
6、ta).3;lrho(3,:)=sin(theta).2;lrho(4,:)=5*cos(3.5*theta).3;lfork=1:4lpolar(theta,rho(k,:)%图形输出lpauselendl将文件存为petal.m,该文件成为一个脚本M文件,在MATLAB命令行窗口中键入petal可运行此M文件。程序运行结束后,变量i、theta和rho均保存在基本工作空间中,可用命令whos查看。Matlab技术技术l【例8-2】函数M文件l%sigexpand.mlfunctionout=sigexpand(d,M)lN=length(d);lout=zeros(M,N);lout(1,
7、:)=d;lout=reshape(out,1,M*N);Matlab技术技术8.1.1 函数变量函数变量l函数中的变量包括局部变量、全局变量和永久变量,函数中的所有变量除非特殊声明外都是局部变量。l全局变量是在不同的函数工作空间以及基本工作空间中可以被共享的变量。任何函数如果需要使用全局变量,则必须首先声明,语法为:lglobal变量名Matlab技术技术l除局部变量和全局变量外,MATLAB中还有一种变量类型为永久变量,永久变量的定义方法为:lpersistent变量名l永久变量有如下特点:l1.只能在M函数文件内部定义。l2.只有该变量从属的函数能够访问该变量。l3.当函数运行结束时,该
8、变量的值保留在内存中,因此当该函数再次被调用时可以再次利用这些变量。Matlab技术技术8.1.2 函数参数函数参数l1. 确定函数参数数目确定函数参数数目l当调用一个函数时,所用的输入变量和输出变量的数目,在函数内是确定的。函数nargin确定输入变量个数;函数nargout确定输出变量个数。l【例8-3】nargin函数和nargout函数的使用。lfunctionc=testarg1(a,b)lif(nargin=1)lc=a.2;lelseif(nargin=2)lc=a+b;lendl如果用户使用一个参数调用函数testarg1,则函数计算输入值的平方。如果使用两个参数调用函数tes
9、targ1,则函数计算输入值之和。Matlab技术技术8.1.3 函数句柄函数句柄l利用函数句柄可以实现对函数的间接调用,可以通过将函数句柄传递给其他函数实现对函数的操作,也可以将函数句柄保存在变量中。l函数句柄通过符号创建,语法为:lfhandle=functionnamel其中functionname为函数名。l函数句柄也可以通过创建匿名函数的方式创建,语法为:lfhandle=(arglist)exprMatlab技术技术l其中expr为函数体,arglist为逗号分隔开的输入变量列表。sqr=(x)x.2创建了用于计算输入变量平方的匿名函数。l如果输入变量为空,则arglist为空。t
10、=()datestr(now)匿名函数的输入变量为空。l通过函数句柄实现对函数的间接调用,其调用语法为:lfhandle(arg1,arg2,.,argN),其中fhandle为函数句柄。l保存函数句柄,可使用单元数组,如下所示。ltrigFun=sin,cos,tan;lplot(trigFun2(-pi:0.01:pi)Matlab技术技术l匿名函数lFH=(arglist)exprl%FH是所创建匿名函数的句柄;arglist是匿名函数的输入量列表;expr是输入量构成的函数表达式l内联函数linline(CE)%把串表达式转化为内联函数8.1.4 匿名函数和内联函数匿名函数和内联函数M
11、atlab技术技术l【例5-26】求f(x)=x-10x+2=0在x0=0.5附近的根。l方法一(函数句柄法)l(1)建立函数文件funx.m.lfunctionfx=funx(x)lfx=x-10.x+2;l(2)调用fzero函数和函数句柄求根.lz=fzero(funx,0.5)l方法二(字符串法):z=fzero(x-10.x+2,0.5)l方法三(匿名函数法):z=fzero(x)x-10.x+2,0.5)l方法四(内联函数法):y=inline(x-10.x+2)lz=fzero(y,0.5)Matlab技术技术8.1.5串演算函数串演算函数levally=eval(CEM)%执行
12、CEM指定的计算ly=eval(CEM1,CEM2)%先执行CEM1指定的计算,如果出错,就执行CEM2ly1,y2,=eval(CEM)%执行对CEM代表的函数文件调用,并输出计算结果lfevally1,y2,=feval(FN,arg1,arg2)%用参数arg1,arg2等执行FN函数指定的运算。Matlab技术技术l【例】feval和eval运行区别之一:feval的FN绝对不能是表达式。lx=pi/4;Ve=eval(1+sin(x) lVe =l 1.7071 lVf=feval(1+sin(x),x) l? Error using = fevallInvalid function
13、 name 1+sin(x).串演算函数串演算函数Matlab技术技术8.1.6 函数类型函数类型l1. 主函数主函数l通常M文件中的第一个函数为主函数,主函数后可以是任意数目的子函数。主函数可以被该文件之外的其他函数调用,主函数的调用通过存储该函数的M文件的文件名调用。l2. 子函数子函数lM文件中可以包括多个函数,除主函数之外的其他函数称为子函数。子函数只能被主函数或该文件内的其他子函数调用。每个子函数以函数定义语句开始,直至下一个函数的定义或文件的结尾。各个子函数以任意顺序出现,但主函数必须最先出现。Matlab技术技术l【例8-8】主函数和子函数。lfunctionavg,med=ne
14、wstats(u)%主函数l%NEWSTATSFindmeanandmedianwithinternalfunctions.ln=length(u);lavg=mean(u,n);%求平均值lmed=median(u,n);%求中值lfunctiona=mean(v,n)%子函数l%Calculateaverage.la=sum(v)/n;lfunctionm=median(v,n)%子函数l%Calculatemedian.lw=sort(v);%升序排列的一组数lifrem(n,2)=1m=w(n+1)/2);lelsem=(w(n/2)+w(n/2+1)/2;lendl当在M文件中调用函
15、数时,系统首先判断是否为子函数,然后判断是否为私有函数,最后判断其是否为当前目录下的标准M文件函数或者系统内置函数。Matlab技术技术l3. 嵌套函数嵌套函数l函数体可以定义其他的函数,这种内部函数称为嵌套函数。当M文件存在一个或多个嵌套函数时,M文件中的所有函数必须以end结束。l嵌套函数的语法如下所示:lfunctionx=A(p1,p2)l.lfunctiony=B(p3)l.lendl.lendl每个函数可以嵌套多个函数,通常为平级嵌套结构和多层嵌套结构。Matlab技术技术l【例8-9】平级嵌套结构。lfunctionx=A(p1,p2)l.lfunctiony=B(p3)l.le
16、ndlfunctionz=C(p4)l.lendl.lendl例中函数A嵌套了函数B和函数C。Matlab技术技术l【例8-10】多层嵌套结构。lfunctionx=A(p1,p2)l.lfunctiony=B(p3)l.lfunctionz=C(p4)l.lendl.lendl.lendl例中函数A嵌套了函数B,函数B嵌套了函数C。一个嵌套函数可以被下列函数调用:l1)该嵌套函数的上一层函数。l2)同一母函数下的同级嵌套函数。l3)被任一低级别的函数调用。Matlab技术技术l【例8-11】嵌套函数的调用lfunctionA(x,y)%PrimaryfunctionlB(x,y);lD(y)
17、;lfunctionB(x,y)%NestedinAlC(x);lD(y);lfunctionC(x)%NestedinBlD(x);lendlendlfunctionD(x)%NestedinAlE(x);lfunctionE(x)%NestedinDl.lendlendlEnd%例中函数A可以调用函数B和函数D,但不能调用函数C和函数E;函数B可以调用函数D和函数C,函数D可以调用函数B和函数E;函数C可以调用函数B和函数D。Matlab技术技术l4. 私有函数私有函数l私有函数是指位于private目录下的M文件函数。私有函数的构造与普通M函数完全相同,私有函数只能被private目录的
18、上一级目录下的M函数文件调用,而不能被其他目录下的任何M函数、M脚本文件调用,也不能被上一级目录下的M脚本文件调用。l5. 重载函数重载函数l函数重载允许多个函数使用相同的函数名,不同的输入变量数据类型。函数调用时,系统根据函数输入变量的数据类型选择对应的函数。Matlab技术技术8.2 MATLAB的程序控制结构的程序控制结构lMATLAB提供了四类程序控制结构方式,分别为条件控制、循环控制、误差控制和程序终止,使MATLAB编程功能更加强大。Matlab技术技术8.2.1 条件控制语句条件控制语句l在编写程序时,经常需要根据不同的条件选择运行的命令,此时需要使用判断语句进行程序控制。l1.
19、 判断语句判断语句l条件判断语句为if语句,通常采用if-else-end分支结构,包含单分支、双分支和多分支三种形式。if语句的最简单结构为:lif逻辑表达式l执行代码块lendl如果逻辑表达式为真,则执行if和end语句之间的代码,如果逻辑表达式为假,则跳过if和end语句之间的代码。Matlab技术技术l【例8-12】if语句的使用。lifrem(a,2)=0ldisp(aiseven)lb=a/2;lendl当逻辑表达式为一个空数组时,MATLAB认为条件为假;当逻辑表达式为变量时,逻辑真的条件为变量非零,对于矩阵变量,则判断矩阵的所有元素为非零。Matlab技术技术l当程序有两个选择
20、时,可以使用if-else-end结构,此时程序结构为:lif表达式l执行代码块1lelsel执行代码块2lendl当表达式为真时,执行代码块1,否则执行代码块2。Matlab技术技术l当程序包含多个选择时,可以使用elseif语句,结构为:lifexpression1lstatements1lelseifexpression2lstatements2lelselstatements3lendMatlab技术技术l2. 分支语句分支语句lMATLAB中的另一种多选择语句为分支语句。分支语句的结构为:lswitch表达式(标量或字符串)lcase值1l语句体1%当表达式=值1时,执行语句体1,然
21、后跳出该结构lcase值2l语句体2%当表达式=值2时,执行语句体2,然后跳出该结构l.l.lotherwisel语句体%当表达式的值不等于前面所有检测值时,执行该语句体lendMatlab技术技术l当表达式等于值1时,执行语句体1,当表达式等于值2时,执行语句体2,当表达式的值不等于关键字case所列的值时,执行otherwise后的语句体,由此可见,上述结构体保证至少有一组命令会得到执行。lswitch命令后的表达式为一个标量或者一个字符串,对于标量形式的表达式,比较相当于表达式=检测值i。对于字符串,MATLAB将调用函数strcmp来实现比较:strcmp(表达式,检测值i)。Matl
22、ab技术技术l【例8-13】switch-case语句的使用lswitchinput_numlcase-1ldisp(negativeone);lcase0ldisp(zero);lcase1ldisp(positiveone);lotherwiseldisp(othervalue);lendl例程中判断输入变量input_num的值,以文本的形式显示。Matlab技术技术lcase命令后面的检测值不仅可以是一个标量或者一个字符串,还可以是一个单元数组。如果检测值是一个单元数组,MATLAB将表达式的值和该单元数组中的所有元素进行比较;如果单元数组中的某个元素和表达式的值相等,MATLAB认为
23、检测结果为真,从而执行与该检测值相等的一组命令。lswitchvarlcase1ldisp(1)lcase2,3,4ldisp(2or3or4)lcase5ldisp(5)lotherwiseldisp(somethingelse)lendMatlab技术技术8.2.2 循环控制语句循环控制语句l循环语句一般用于有规律的循环计算,能够在很大程度上精简代码。MATLAB中的循环语句有两种:for语句和while语句。l1. for语句语句lfor循环允许一组命令以固定和预定的次数重复。for循环的结构为:lfor循环变量=开始值:增量:结束值l执行代码块lendl缺省增量为1,可以指定任意的增量
24、。如果增量值为正,则当循环变量大于结束值时,循环终止;如果增量值为负,则当循环变量小于结束值时,循环终止。for循环不能用for循环内重新赋值循环变量来终止。lfor循环可以嵌套使用。Matlab技术技术l【例8-14】for循环的嵌套lform=1:5lforn=1:100lA(m,n)=1/(m+n-1);lendlendlfor循环的循环变量可以为数组,考虑m行n列矩阵A,程序中循环次数等于矩阵的列数,每一次循环k是矩阵A的列矢量。lfork=AlstatementslendMatlab技术技术l2. while循环循环lfor循环以固定次数执行程序代码,while循环以可变的次数执行程
25、序代码,当while的条件表达式为真时,执行代码块,直到条件表达式为假。while语句的结构为:lwhile表达式l执行代码块lendl【例8-15】计算n!100的最大的n值。ln=1;lwhileprod(1:n)n=4;lA=pascal(3);ltrylA_n=A(n,:),lcatchlA_end=A(end,:),lendlA_end=l136llasterrlans=lIndexexceedsmatrixdimensions.Matlab技术技术8.2.4 其他流程控制语句其他流程控制语句l在程序设计中通常需要提前终止循环、结束程序的运行、显示错误信息等情况,MATLAB提供了c
26、ontinue、break、return、echo、error等语句,与前面介绍的语句相结合,更好地完成流程的控制。Matlab技术技术l1. continue语句语句lcontinue语句通常用在循环控制中,包括for循环和while循环,用于结束当次循环,继续执行下一次循环,但是不结束当前循环。一般continue语句与if语句相结合,当满足一定的条件时,执行continue语句。Matlab技术技术l【例8-17】continue语句用于循环控制lfid=fopen(magic.m,r);%打开文件,并获得文件指针lcount=0;lwhilefeof(fid)%文件指针没有到末尾的时候
27、lline=fgetl(fid);%取出该行内容赋给linelifisempty(line)|strncmp(line,%,1)%如果是空行或者注释行lcontinuelendlcount=count+1;lendldisp(sprintf(%dlines,count);Matlab技术技术l2 break语句语句l与continue语句相同的是,break函数也用于循环控制,中断当前循环。与continue不同,break跳出当前循环,不再执行该循环的任何操作。l【例8-18】break语句用于循环控制lfid=fopen(fft.m,r);ls=;lwhilefeof(fid)lline=
28、fgetl(fid);lifisempty(line),lbreak,lendls=strvcat(s,line);lendldisp(s)%输出第一个空行上面的所有内容Matlab技术技术l3. return语句语句lreturn函数结束正在运行的函数,返回到调用函数。经常用于函数的末尾正常结束函数的运行,也可以在某条件满足时强行结束函数的运行。l4. error语句语句l显示出错信息并终止当前函数的运行,error函数的语法为:lerror(message)l类似的语句还有warning函数,二者区别在于warning函数显示警告信息后程序仍继续执行。Matlab技术技术l5. input
29、语句语句linput函数用来提示用户从键盘输入数值、字符串或数组等数据,并接收输入值,input函数的语法为:luser_entry=input(prompt)l在屏幕上显示提示信息prompt,等待用户的输入,并将输入赋给变量user_entry。luser_entry=input(prompt,s)l在屏幕上显示提示信息prompt,等待用户的输入,并将输入作为字符串赋给变量user_entry。Matlab技术技术l6. keyboard语句语句l程序运行时如果遇到keyboard函数,将停止文件的执行并将控制权交给键盘。通过在提示符前显示K来表示一种特殊状态。在M文件中使用该函数,对程
30、序的调试和在程序运行中修改变量都很方便。l7. pause语句语句l该命令用于暂时中止程序的运行,等待用户按任意键继续运行。该函数在程序的调试过程和用户需要查询中间结果时使用,pause函数的语法为:lpause%停止M文件的执行,按任意键继续lpause(n)%中止执行程序n秒后继续,n是任意整数lpauseon%允许后续的pause命令暂时中止程序的运行lpauseoff%禁止后续的pause命令暂时中止程序的运行Matlab技术技术8.4 MATLAB程序优化程序优化lMATLAB提供了两种方法进行程序的优化,一种通过Profiler工具,另一种通过tic和toc函数进行。本节将介绍这两
31、种程序运行分析的方法,并介绍程序优化的常用方法。Matlab技术技术8.4.1 通过通过Profiler进行程序运行分析进行程序运行分析lProfiler工具为MATLAB中的图形用户接口,用于分析程序运行时各个部分所消耗的时间,辅助用户进行程序优化。Profiler可以从以下几个方面提供程序运行信息。l1.避免由于疏忽造成的非必要操作。l2.替换运行较慢的算法,选择快速算法。l3.通过存储变量的方式避免重复计算。Matlab技术技术l通过Profiler工具进行程序运行分析通常按以下步骤进行:l1.查看Profiler生成的通体报告,查找运行时间最多的函数或调用最频繁的函数。l2.查看这些函
32、数的详细报告,查找其中运行时间最多的语句或调用最频繁的语句。l3.确定在运行时间最多的函数或代码是否存在改进的可能。l4.单击界面链接,打开相应文件进行修改。l5.重复进行上述的分析、修改,直到得到满意结果。Matlab技术技术l下面介绍Profiler工具的具体使用。l1. 打开打开ProfilerlMATLAB中可以通过以下方式打开Profiler:l1)单击MATLAB工具栏中的Profiler图标,激活Prolifer工具。l2)对于在编辑器中打开的M文件,选择Tools-OpenProfiler。l3)在命令行窗口中输入:profilerviewer。Matlab技术技术l2. 运行
33、运行ProfilerlProfiler工具界面如图8.1所示。在Runthiscode中输入需要分析的命令或表达式,单击startprofiling按钮,开始分析。Matlab技术技术l3. 查看分析结果查看分析结果l分析完成后,Profiler会生成分析报告,包括总体报告和针对每个函数的详细报告。总体报告中包括函数名、被调用次数、总运行时间、函数单独运行时间(即不包含其子函数的运行时间)及函数运行时间的图形显示,如图8.2所示。用户可以单击每列的标题改变结果的排序方式,也可以单击函数标题查看该函数的详细报告。Matlab技术技术l函数详细报告中包括该函数中每行代码的被调用次数和运行时间,并且
34、可以显示其中的子函数、函数列表等,如图8.3所示。另外用户可以单击“Copytonewwindowforcomparingmultipleruns”将该结果保存至新的窗口中,用于修改代码后进行再次分析、比较。Matlab技术技术8.4.2 通过通过tic和和toc函数进行程序运行分析函数进行程序运行分析l如果只需要了解程序的运行时间,或者比较一段程序在不同应用条件下的运行速度,可以通过计时器来进行。计时器包含两个函数:tic和toc函数。tic函数用于开始计时器,toc用于关闭计时器,并计算程序运行的总时间。计时器函数的语法为:lticlanystatements%所需计时的程序代码ltocl
35、t=toc%保存计时时间Matlab技术技术8.4.3 程序优化的常用方法程序优化的常用方法l同样的功能可以采用不同的编程方法实现,不同的编程方法运行速度不同。本节将介绍一些提高M文件执行速度、优化内存管理的常用方法,包括循环向量化和数组内存的预分配等。Matlab技术技术l1. 循环向量化循环向量化lMATLAB的一个缺点是当对矩阵的单个元素作循环时运算速度很慢。编程时,把循环向量化,不但能缩短程序的长度,更能提高程序的执行效率。由于MATLAB的基本数据类型为矩阵和向量,所以编程时,应尽量对向量和矩阵编程,而不是对矩阵元素进行编程。Matlab技术技术l【例8-20】向量化for循环l%l
36、oop.mlticlx=1;lfork=1:1001ly(k)=log10(x);lx=x+0.01;lendltocllooplElapsedtimeis0.006188seconds.Matlab技术技术l%vetcor_loop.mlticlx=1:0.01:10;ly=log10(x);ltoclvector_looplElapsedtimeis0.003630seconds.Matlab技术技术l2. 数组内存预分配数组内存预分配l在for循环或while循环中,如果数组大小随着循环而增加则会严重影响内存的使用效率。如下面的代码:lx=0;lfork=2:1000lx(k)=x(k-
37、1)+5;lendMatlab技术技术l该代码首先创建变量x,其值为0,在for循环中,将其扩展为长度为1000的一维数组。在每一次扩展中,系统需要寻找更大的连续内存区域,用于存放该数组,并将数组从原地址移动到新地址中。该代码可以通过下面的代码实现:lx=zeros(1,1000);lfork=2:1000lx(k)=x(k-1)+5;lendl在该代码中,首先为数组x分配内存区域,将x的所有元素赋值为0。这样可以节约重新分配内存的时间,提高程序的效率。Matlab技术技术lMATLAB中,可以用于分配内存的函数有zeros和cell,分别用于数值数组和单元数组分配内存。用zeros为数组分配
38、内存时,如果数组的类型是double以外的类型,则应利用下面的语句进行:lA=zeros(100,int8);l该语句为A分配100*100的int8类型的内存。lA=int8(zeros(100);l该语句为A分配100*100的double类型的内存,再将其转换为int8类型。Matlab技术技术l3. 其他方法其他方法l1)对数组赋值时避免改变数组的类型或者数组大小。l2)对实数进行操作,尽量避免复数的操作。l3)合理使用逻辑运算符。l4)避免重载MATLAB中的内置函数和操作符。l5)通常情况下函数的运行效率高于脚本文件。l6)load和save函数效率高于文件输入输出函数。Matla
39、b技术技术8.5 程序调试程序调试lMATLAB程序中的错误包括语法错误和逻辑错误。l语法错误可以由编译器检测,在编写时,如果语法出现错误,则编辑器会在错误处标志红色弯曲下划线,同时如果将鼠标放置此处会显示错误内容提示。或者当下划线为橙色时,表示此处语法正确,但是可能会导致错误,即系统发出警告。在编写程序时,注意系统的提示可以避免大部分语法错误。另外,如果出现函数名错误或者变量错误,在编译运行时,系统会提示错误,用户可以将其改正,但是逻辑错误是算法本身的问题,或者指令使用不当造成的运行结果错误。这些错误发生在运行过程中,影响因素很多,调试较为困难。l通常程序调试有两种方法:直接调试法和利用MA
40、TLAB调试工具进行调试的方法。Matlab技术技术8.5.1 直接调试法直接调试法lMATLAB语言具有强大的运算能力,指令系统简单,因此程序通常非常间接。对于简单的程序可以采用直接调试的方法。l在程序调试时,程序运行中变量的值是一个重要的线索。因此,查看变量值是程序调试的重要线索,由于在函数调用时只返回最后的输出参数,而不返回中间变量,因此可以选择下面的方法查看程序运行中的变量值。Matlab技术技术l1.通过分析,将可能出错的语句后面的分号(;)删除,将结果显示在命令窗口中,与期望值进行比较。l2.利用函数disp显示中间变量的值。l3.在程序中的适当位置添加keyboard指令。当MA
41、TLAB执行到此处时将暂停,等待用户反应。当程序运行到此时将暂停,在命令窗口中显示k提示符,用户可以查看工作区间中的变量,可以改变变量的值,输入return指定返回程序,继续执行。l4.在调试一个单独的函数时,可以将函数改写为脚本文件,此时可以直接对输入参数赋值,然后对脚本方式运行该M文件,这样可以保存中间变量,在运行完成后,可以查看中间变量的值,对结果进行分析,查看错误位置。Matlab技术技术8.5.2 利用调试工具利用调试工具l上面的调试方法对于简单的程序比较适用,当程序规模很大时可以使用MATLAB自带的调试工具。利用MATLAB调试工具可以提高编程的效率。调试工具包括命令行形式的调试
42、函数和图形界面形式的菜单命令。文本编辑器中的Debug菜单提供了全部的调试选项,调试选项及其功能如表8.4所示。Matlab技术技术选项功能快捷键Open M-files when Debbuging调试打开M文件无Step下一步F10Step in进入被调试函数内部F11Step out跳出当前函数Shift+F11Continue执行,直至下一断点F5Go until Cursor执行至当前光标处无Set/clear Breakpoint设置或删除断点F12Set/Modify Conditional Breakpoint设置或修改条件断点无Enable/Disable Breakpoin
43、t开启或关闭光标行的断点无Clear Breakpoints in All Files删除所有文件中的断点无Stop if Errors/Warnings遇到错误或者警告时停止无Matlab技术技术l1.Set/ClearBreakpoint,设置或清除断点。可以选择该选项对当前行进行操作,或者通过快捷键F12,或者直接单击该行左侧的-。设置断点时该处显示为红点,再次进行相同的操作则删除该断点。l2.Set/ModifyConditionalBreakpoint,该选项用于设置或修改条件断点。条件断点为一种特殊的断点,当满足指定的条件时则程序执行至此处时运行停止,条件不满足时则程序继续运行。l3.Enable/DisableBreakpoint,该选项用于开启或关闭当前行的断点,如果当前行不存在断点,则设置当前行为断点;如果当前行为断点,则改变该断点的状态。在调试时,被关闭的断点将会被忽略。Matlab技术技术l在程序调试时,变量的值是查找错误的重要线索,在MATLAB中查看变量的值可以有三种方法。l1.在编辑器中将鼠标放置在待查看的变量处,停留,则在此处显示该变量的值。l2.在工作区浏览器中查看该变量的值。l3.在命令窗口中输入该变量的变量名,则显示该变量的值。l在实际编写程序时,需要根据不同的情况灵活应用这些功能,达到最高的调试效率。Matlab技术技术