您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 第11讲函数与程序的调试
第11讲函数与程序的调试2本讲教学目标掌握函数文件的基本结构掌握Matlab函数的调用方法了解函数参数的可调性掌握函数的句柄和常用的程序调试方法了解各种不同类型的函数311.1函数11.1.1函数文件基本结构由function语句引导,其基本结构为:function输出形参表=函数名(输入形参表)注释说明部分函数体语句函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于一个时,则应该用方括号括起来。4例1:编写函数文件求半径为r的圆的面积和周长。函数文件如下:%calculatetheareaandperimeterofacircleofradiirfunction[s,p]=fcircle(r)%r—圆半径,s—圆面积,p—圆周长s=pi*r*r;p=2*pi*r;511.1.2函数调用函数调用的一般格式是:[输出实参表]=函数名(输入实参表)注意:函数调用时各实参出现的顺序和个数,应与函数定义时形参的顺序和个数一致,否则会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。在MATLAB中,函数可以嵌套调用,即函数可以调用别的函数,甚至调用它自身。一个函数调用它自身称为递归调用。6例2:利用函数文件,实现直角坐标(x,y)与极坐标(rho,theta)之间的转换。函数文件tran.m:function[rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);调用tran.m的命令文件main1.m:x=input('Pleaseinputx=:');y=input('Pleaseinputy=:');[rho,the]=tran(x,y)7例3:利用函数的递归调用,求n!。递归调用函数文件factor.m如下:functionf=factor(n)ifn=1f=1;elsef=factor(n-1)*n;%递归调用求(n-1)!endn!本身就是以递归的形式定义的,即求n!需要求(n-1)!,这时可采用递归调用。811.1.3函数参数的可调性函数nargin和函数nargout分别用于确定函数的输入输出参数个数。函数nargin和函数nargout允许函数接收或返回任意数目的参数。只要在函数文件中包含这两个函数,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。9例4:nargin用法示例。函数文件examp.m:functionfout=charray(a,b,c)ifnargin==1fout=a;elseifnargin==2fout=a+b;elseifnargin==3fout=(a*b*c)/2;end命令文件my.m:x=[1:3];y=[1;2;3];examp(x)examp(x,y')examp(x,y,3)1011.1.4函数句柄函数句柄可以实现对函数的间接操作,可以通过将函数句柄传递给其他函数实现对函数的操作,也可以将函数句柄保存在变量中,留待以后调用操作。函数句柄的创建格式如下:fhandle=@functionname其中fhandle为创建的函数functionname的函数句柄。11若要保存函数句柄,可以使用单元数组,如下:trigFun={@sin,@cos,@tan};通过函数句柄实现对函数的间接调用,其调用格式与直接调用函数的格式相同:fhandle(arg1,arg2,...,argn)其中fhandle为函数句柄。例5:函数句柄操作。trigFun={@sin,@cos,@tan};plot(trigFun{2}(-pi:0.01:pi))12函数句柄的操作判断2个函数句柄是否为某一相同函数的句柄isequal判断一个变量是否包含由一个函数句柄isa从一个M文件中向当前工作区间调用函数句柄load从当前工作区间向M文件保存函数句柄save由一个函数名的字符串创建一个函数句柄str2func根据函数句柄创建一个函数名的字符串func2str返回函数句柄的相关信息functions功能描述函数名判断2个函数句柄是否为某一相同函数的句柄isequal判断一个变量是否包含由一个函数句柄isa从一个M文件中向当前工作区间调用函数句柄load从当前工作区间向M文件保存函数句柄save由一个函数名的字符串创建一个函数句柄str2func根据函数句柄创建一个函数名的字符串func2str返回函数句柄的相关信息functions功能描述函数名1311.1.5匿名函数匿名函数提供了一种创建简单程序的方法,可以使用户不必每次都编写M文件,可以在命令窗口或其他任意M文件和脚本文件中使用。格式为:fhandle=@(arglist)expr其中fhandle为该函数创建的函数句柄;@符号用于创建函数句柄;arglist为用逗号分隔的参数列表;expr为函数主体,一般为表达式。1411.1.6主函数通常M文件中的第一个函数为主函数,主函数之后可以是任意数量的子函数,它们可以作为主程序的子程序。一般来说,主函数可被该文件之外的其他函数调用,而子函数只能被该文件内的函数调用。在命令窗口或M文件种只能调用主函数,调用的时候是通过存储该函数的M文件名进行。1511.1.7子函数与其他语言一样,在MATLAB7语言中也可以很方便地定义子函数,用来扩充函数的功能。在函数文件中题头定义的函数为主函数,而在函数体内定义的其他函数都被视为子函数。每个子函数以函数定义语句开头,直至下一个函数的定义或文件的结尾。子函数只能为主函数或同一主函数下的其他子函数所使用。1611.1.8嵌套函数一个函数内部可以定义其他的函数,这种内部的函数称作嵌套函数。定义嵌套函数时,只要在一个函数内部直接定义嵌套函数即可。注意:当一个M文件中存在嵌套函数时,该文件内的所有函数必须以end结尾。17例6:嵌套函数的结构functionx=A(p1,p2)...functiony=B(p3)...end...end每个函数中可以嵌套多个函数。1811.1.9私有函数这类函数位于名为“private”的子文件夹中,只能被上一级文件夹中的函数或者这些函数所调用的M文件调用。如当前文件夹为math,其中包含private文件夹,则private中的函数只能被math根目录下的函数及这些函数调用的M文件调用。用户可开发自己的函数库,其名称可以与系统标准M函数库名称相同,而不必担心在函数调用时发生冲突,因为MATLAB首先查找私有函数,再查找标准函数。1911.1.10重载函数函数重载为程序编写和用户调用都提供了很大的方便。函数重载允许多个函数使用相同的函数名,不同的输入参数类型。在函数调用时,系统根据输入参数的情况自动选择相应的函数执行。2011.2程序的调试和优化11.2.1程序的调试程序的错误种类错误的识别和程序调试11.2.2程序的优化程序优劣的分析程序优化的技巧有效地使用内存2111.2.1程序的调试程序的错误种类在MATLAB的表达式中存在两种类型的错误:(1)语法错误语法错误发生在M文件程序代码的生成过程中,一般是由函数参数输入类型有误或是矩阵运算阶数不符等引起。(2)运行错误运行错误一般指在程序运行过程中,出现溢出或是死循环等异常现象。2211.2.1程序的调试错误的识别和程序调试错误识别函数及其功能显示特定的错误信息error显示特定的警告信息warning回复keyboard命令后函数的运行return中断程序运行,允许用户从键盘进行交互操作keyboard显示矩阵的维数size列出工作区间的所有变量whos显示不同格式和类型的数据Sprintf&fprintf显示特定的值或信息disp在函数运行时显示代码echo功能描述函数名显示特定的错误信息error显示特定的警告信息warning回复keyboard命令后函数的运行return中断程序运行,允许用户从键盘进行交互操作keyboard显示矩阵的维数size列出工作区间的所有变量whos显示不同格式和类型的数据Sprintf&fprintf显示特定的值或信息disp在函数运行时显示代码echo功能描述函数名2311.2.1程序的调试错误的识别和程序调试程序断点的设置结束调试状态dbquit实现工作区间的切换dbup/dbdowm显示M文件执行时调用的堆栈dbstack该函数用于从断点处继续执行M文件dbstep显示M文件文本dbtype显示断点信息dbstatus用于在M文件中设置断点dbstop描述函数结束调试状态dbquit实现工作区间的切换dbup/dbdowm显示M文件执行时调用的堆栈dbstack该函数用于从断点处继续执行M文件dbstep显示M文件文本dbtype显示断点信息dbstatus用于在M文件中设置断点dbstop描述函数2411.2.2程序的优化程序优劣的分析在MATLAB7语言中,使用profile函数以及计时函数tic和toc来分析程序中各个部分的耗时情况,从而帮助用户找出程序中需要改进的地方。其中profile在计算相对耗时以及查找文件执行过程中瓶颈问题时更为有效,而tic和toc函数在计算绝对耗时时更为有效。2511.2.2程序的优化程序优化的技巧(1)程序的向量化操作循环运算是MATLAB中的最大弱点,在程序设计中,应当尽量避免使用循环运算。用户可以通过将M文件向量化来优化M文件,即使用向量和矩阵运算来代替for循环和while循环。(2)数据的预定义使用for和while循环来增加数据结构的大小时,将影响系统和内存的使用,而预定义可提高效率。26本节完,谢谢!!
本文标题:第11讲函数与程序的调试
链接地址:https://www.777doc.com/doc-2153218 .html