资源描述
2.6M文件及程序调试河西学院物电系2010/01/231.在入门阶段,通常让MATLAB工作在行命令模式下,键入一行命令后,系统立即执行该命令,用这种方法时,程序可读性很差且难以存储。解决复杂的问题应该用命令编成可存储的程序文本,再让MATLAB执行该程序文件,这种工作模式称为程序文件模式。由MATLAB语句构成的程序文件称为文件,它以m作为文件的扩展名。例如,文件expml.m用来计算矩阵指数函数的值。因为它是ASCII文本文件,所以可以直接阅读并用任何编辑器来建立。前言2.文件可分为两种:一种是主程序,也称为主程序文件(ScriptFile),是由用户为解决特定的问题而编制的;另一种是子程序,也称为函数文件(FunctionFile),它必须由其他M文件来调用,函数文件往往具有一定的通用性,并且可以进行递归调用(即自己可以调用自己)。MATLAB的基础部分中已有了近800个函数文件,它的工具箱中还有千余个函数文件,并在不断扩充积累。MATLAB软件的大部分功能都是来自其建立的函数集,利用这些函数可以使用户方便地解决他们的特定问题。3.2.6.1主程序文件主程序文件的格式特征如下:(1)用clear,closeall等语句开始,清除掉工作空间中原有的变量和图形,以避免其他已执行的程序残留数据对本程序的影响。前几行通常是对此程序用途的说明,特别是在运行时对用户输入数据的要求,更要叙述清楚,不然别人就看不懂也用不成,连自己日后也会遗忘。这些注释行必须以“”开始,以便计算机执行时不予理会。MATLAB规定,在键入help文件名时,屏幕上会将该文件中以“”起头的最前面各行内容显示出来,使用户知道如何使用。这些注释是可以用汉字的。“”也可以放在程序行的后面,MATLAB将不执行该字符后的任何内容。4.2.6.1主程序文件(2)以下是程序的主体。如果文件中有全局变量,即在子程序中与主程序共用的变量,应在程序的起始部分注明。其语句是Global变量名1变量名2为了改善可读性,要注意流程控制语句的缩进及与end的对应关系。另外,程序中必须都用半角英文字母和符号(只有引号括出的和“”后的内容可用汉字)。特别要注意英文和汉字的有些标点符号(如句号、冒号、逗号、分号、引号乃至、()等),看起来很相似,其实代码不同,用错了,不但程序执行不通,而且几乎必定死机。因此键入程序时,最好从头到尾用英文,不要插入汉字。汉字可在程序调试完毕后加入。用MATLAB的编辑器比较好,因为它对出现的非法字符会显示出特殊的颜色,引起用户的注意。并且在它的菜单项【Text】下,选【SmartIndent】项可以自动对程序进行缩进排版。5.2.6.1主程序文件(3)整个程序应按MATLAB标识符的要求起文件名,并加上后缀m。文件名长度不要超过八个字符。不允许用汉字,因为这个文件名也就是MATLAB的调用命令,它是不认汉字的。将文件存入自己确定的子目录中,该子目录应置于MATLAB的搜索路径下。完成程序编制,并在MATLAB的命令窗中键入此程序的文件名后,系统就开始执行文件中的程序,主程序文件中的语句将对工作空间中的所有数据进行运算操作。6.2.6.1主程序文件【例例2-6-1】要求列写一个求Fibonnaci数的程序。它是一个数列,从1,1开始,由数列的最后两个元素之和生成新的元素,依次递推。其程序如下:%计算Fibonnaci数的M文件clear,closeallN=input(输入最大数值范围N=)f=1,1;i=1;%变量的初始化whilef(i)+f(i+1)f,plot(f)%显示和绘图Fibonacci数是数列f1,f2,f3的元素,这里f1=f2=1,且若n是正整数。7.2.6.1主程序文件将此程序以文件名fibon.m存入某一MATLAB搜索目录下。在MATLAB命令窗中键入fibon,系统就开始执行这个程序,它首先会要求用户输入N,然后计算数值小于N的Fibonnaci数,并绘出图线。设输入N100,得出(图线略)f=11235813213455898.2.6.1主程序文件打开一个新的文本编辑窗,在此写程序,即可保存、调用键入保存的文件名,即可调用该程序。该文件执行结束,变量和仍保存在工作空间中。9.2.6.1主程序文件10.2.6.1主程序文件【例例2-6-2】列出求素数的程序。所谓素数就是只能被它自身和1整除的数。程序如下:%求素数(primenumber)的程序clear,closeallN=input(N=),x=2:N;%列出从2到N的全部自然数foru=2:sqrt(N)%依次列出除数(最大到N的平方根)n=find(rem(x,u)=0&x=u);%找能被u整除而不等于u的数序号x(n)=;%剔除该数end,x%循环结束,显示结果以prime.m为名存入系统,就可以执行了。给出N=40,结果为x=2357111317192329313711.2.6.1主程序文件建立M文件clcClearcloseallN=input(N=),x=2:N;foru=2:sqrt(N)n=find(rem(x,u)=0&x=u);x(n)=;end,x以prime.m为名存入系统,就可以执行了。给出N=40,结果为给出N=40,结果为12.2.6.2人机交互命令在执行主程序文件时,往往还希望在适当的地方对程序的运行进行观察或干预,这时就需要人机交互的命令,调试程序时,人机交互命令更不可少。下面介绍几条人机交互命令,见表2-13。13.2.6.2人机交互命令14.2.6.2人机交互命令echoon(off):一般情况下,文件中的命令不会显示在屏幕上。而在命令echoon之后,会在执行每行程序前先显示其内容。pause(n):程序执行到此处,暂停n秒,再继续执行。如果没有括号参数,则等待用户键入任意键后才继续执行。keyboard:程序执行到此处暂停,在屏幕上显示字符K,并把程序的输入和执行权交给用户(键盘)。用户可以像在普通MATLAB命令窗中那样进行任何操作(例如检查中间结果等)。如果需要系统恢复运行原来的程序,只需键入字符串return。在文件中设置该命令,有利于进行程序调试以及临时修改变量内容。15.2.6.2人机交互命令input(提示文字):程序执行到此处暂停,在屏幕上显示引号中的提示字符串。要求用户输入数据。如程序为Xinput(X=),则屏幕上显示“X=”,输入的数据将赋值给X。数据输入后,程序继续运行。input命令也可以接受字符,其格式为Y=input(提示文字,s),此时Y将等于输入的字符串。C:强行停止程序运行的命令。C读作(ControlC),即先按下Ctrl键,不抬起再按C键。在发现程序运行有错或运行时间太长时,可用此方法中途终止它。menu:是用来产生人机交互备选菜单的命令,参阅help文件。uimenu,uicontrol:这些是用来产生人机交互面板按钮的命令,参阅help文件。后面两条命令是在编制较复杂的程序的图形界面时使用的,无法用三言两语说明。读者可在用到时再去查阅有关资料。16.2.6.2人机交互命令键入echoon再调用prime,会在执行每行程序前先显示其内容。键入echooff,则不再显示。17.2.6.2人机交互命令键入keyboard程序执行到此处暂停,在屏幕上显示字符K,并把程序的输入和执行权交给用户(键盘)。我们可以像在普通MATLAB命令窗中那样进行任何操作(例如检查中间结果等)。如果需要系统恢复运行原来的程序,只需键入字符串return。在文件中设置该命令,有利于进行程序调试以及临时修改变量内容18.2.6.2人机交互命令input命令也可以接受字符,其格式为Y=input(提示文字,s),此时Y将等于输入的字符串。19.2.6.2人机交互命令键入K=menu(Chooseacolor,Red,Blue,Green)回车,产生一一菜单。点击其中一个按钮,比如点击blue,则显示如下。20.2.6.2人机交互命令uimenu功能生成图形窗口的菜单中的层次的菜单与下一级子菜单。即增加新的菜单于已经存在的菜单后面,当一菜单项被选中时,该菜单项与它的下一级菜单也将显示。也可用该命令生成与组件相关的菜单。用法handle=uimenu(PropertyName,PropertyValue,)在当前图形窗口菜单条上用指定的属性PropertyName与相应的属性值PropertyValue创建一菜单,同时将该菜单的句柄赋给handle。其中两个输入参量可以是结构数组或者是单元数组。用户界面菜单的回调函数属性定义了当用户激活菜单项时,进行的响应操作。uimenu(PropertyName,PropertyValue,)效果同上,但不返回句柄值。handle=uimenu(parent,PropertyName,PropertyValue,)生成一父菜单的子菜单,或者是生成由parent指定的相关菜单中的菜单项目。若parent不是另外的用户界面菜单对象或用户界面相关菜单对象,而是一图形窗口,则系统将生成该图形窗口菜单条上的新的菜单。同时将生成的菜单赋值给句柄handle。uimenu(parent,PropertyName,PropertyValue,)效果同上,但不返回菜单的句柄。21.2.6.2人机交互命令键入uicontrol(Style,edit,String,hello);%createsuicontrolspecifiedinanewfigure22.2.6.3函数文件函数文件是用来定义子程序的。它与程序文件的主要区别有三点:(1)由function起头,后跟的函数名必须与文件名相同;(2)有输入输出变量,可进行变量传递;(3)除非用global声明,程序中的变量均为局部变量,运行后不保存在工作空间中。23.2.6.3函数文件先看一个简单的函数文件,其文件名为mean.m,键入typemean后,屏幕将显示元件的内容:functiony=mean(x)%MEAN求平均值。对于向量,mean(x)返回该向量x中各元素的平均值%对于矩阵,mean(x)是一个包含各列元素平均值的行向量m,n=size(x);ifm=1M=n;end%处理单行向量y=sum(x)/m文件的第一条语句定义了函数名、输入变元以及输出变元。没有这条语句,该文件就成为程序文件,而不再是函数文件了。输入变元和输出变元都可以有若干个,但必须在第一条语句中明确地列出。24.2.6.3函数文件程序中的前几条带的字符行为文件提供注解,键入helpmean命令后,系统将显示这几条文字,作为对文件mean.m的说明,这和主程序文件相同。变量、和都是函数mean的局部变量,当mean.m文件执行完毕,这些变量值会自动消失,不保存在工作空间中。如果在该文件执行前,工作空间中已经有同名的变量,系统会把两者看做各自无关的变量,不会混淆。这样,调用子程序时就不必考虑其中的变量与程序变量冲突的问题了。如果我们希望把两者看成同一变量,则必须在主程序和子程序中都加入global语句,对此共同变量作出声明。给输入变元x赋值时,应把x代换成主程序中的已知变量,假如它是一个已知向量或矩阵Z,可写成mean(Z),该变量Z通过变元替换传递给mean函数后,在子程序内,它就变成了局部变量x。25.2.6.3函数文件保存名字默认为mean1.m。以免和系统自带程序混淆。26.2.6.3函数文件键入输入数据,即可显示输出结果。改变输入变量,可以得到相对应的输出结果。此时的x是形式变量,可以用其他字母代替,不影响结果27.2.6.3函数文件键入helpmean1以及typemean1后显示如图所示。指的是当前工作目录下的所保存的数据。28.2.6.3函数文件键入helpmean以及typemean后显示如图所示。指的是系统自带程序。还可以openmean.m打开MATLAB自带程序29.2.6.3函数文件下面的例子是多输入变量函数logspace,用于生成等比分割的数组:functiony=logspace(d1,d2,n)%logspace对数均分数组%logspace(d1,d2)在10d1与10d2之间生成长度为50的对数均分数组%如果d2为pi,则这些点在10d1和pi之间%logspace(d1,d2,n)生成的数组长度为n,n的缺省值为50ifnargin=2n=50;end%输入变元分析及n的缺省值设置ifd2=pid2=log10(pi);end%d2为pi时的设置y=(10).d1+(0:n-1)*(d2-d1)/(n-1);%将结果返回到输出变元一般来说logspace(y1,y2,N)表示在10y1和10y2之间插入N-2个数,如果N2,则返回值为10y2.30.2.6.3函数文件在本例中使用了特定变量nargin表示输入变元的数目。当只有两个输入变元时,它默认n=50,nargout是表示输出变元数目的变量。MATLAB常常根据nargin和nargout的数目不同而调用不同的程序段,从而体现它的智能作用。31.2.6.3函数文件M函数文件logspace.m。32.2.6.3函数文件调用logspace.m文件,同样文件中的d1,d2,n也是形式变量,且n的默认值为50,及50可写可不写,但是一定不能在不定义n的具体值的情况直接写作n。N也为除50以外的数33.2.6.3函数文件再来看MATLAB是如何定义一个任意非线性函数的。在对微分方程作数值积分或解任意非线性方程求解时,都需要先列出一个这样的函数文件。一个典型程序如下:functiony=humps(x)%humps是由QUADDEMO、ZERODEMO和FPLOTDEMO等程序调用的一个函数%humps(X)是一个在x=0.3和x=0.9附近有尖锐极大值的函数%参看QUADDEMO、ZERODEMO和FPLOTDEMOy=1./(x-.3).2+.01)+1./(x-.9).2+.04)6;程序中的运算都采用元素群算法,以保证此函数可按元素群调用。MATLAB中几乎所有的函数都能用元素群运算,所以我们自编的子程序,也要尽量满足元素群算法的要求。34.2.6.3函数文件保存logspace.m文件35.2.6.3函数文件调用logspace.m文件36.2.6.4内联函数和匿名函数用上节介绍的方法来定义函数,必须在主程序之外重新建立一个函数文件,这不大方便。MATLAB还提供了一种简便的、直接在主程序文件中定义函数的方法,称为内联函数。它的调用格式为fun=inline(函数内容,自变量列表)其中,“函数内容”需要填写函数的具体语句,即与函数文件中的核心语句完全一样。自变量列表类似于function格式下的输入变元,不过每个自变量必须用单引号括起来。例如f(x,y)=x3+x.*y.2就可以用f=inline(x.3+x.*y.2,x,y)来直接定义。不过这样的格式只能用来定义比较简单的、用一条语句就能求出结果的函数形式。37.2.6.4内联函数和匿名函数键入f=inline(x.3+x.*y.2,x,y)38.2.6.4内联函数和匿名函数匿名函数是MATLAB7.x版给出的新的函数定义形式,它的基本格式为fun=(自变量列表)函数内容例如f=(x,y)x.3+x.*y.2可见,它和inline函数很相似,但键入量更少,更简洁。更重要的是,该函数允许直接使用MATLAB工作空间中的变量。例如,在MATLAB工作空间中已经有了a和b,则匿名函数f=(x,y)cos(a*x+b*y)就可以成立,无需把a、b列入变量列表中,所以使数学函数的定义更加方便。注意,匿名函数中取的是当前工作空间中的变量,在定义了匿名函数后,如果a、b的数值发生变化,匿名函数中的a、b值不会跟着改变。39.2.6.4内联函数和匿名函数键入f=(x,y)x.3+x.*y.240.2.6.5文件编辑器及程序调试MATLAB提供的编辑器的用法与Word相仿,同时,它把编辑与调试结合在一起了。实际上,MATLAB的主程序是比较好调试的,因为MATLAB的查错能力很强,配上工作空间中变量的保存和显示功能,不需要用专门的调试命令,调试也可以很方便地进行。41.2.6.5文件编辑器及程序调试解决这个问题可用下列措施:(1)把某些分号改为逗号,使中间结果能显示在屏幕上,作为查错的依据。(2)在子程序中适当部位加keyboard命令,到了此处,系统会暂停而等待用户键入命令。这时子程序中的变量还存在于工作空间中,可以对它们进行检查。(3)将函数文件的第一行前加号,使它成为程序文件,做初步调试。第一行中的输入变元,可改用input或赋值语句来输入,调好后再改回函数文件。(4)使用MATLAB提供的调试命令。根据我们的体会,当程序不太长(例如20行以下)时,用调试命令反而麻烦。42.谢谢观看!
展开阅读全文