精通MATLAB科学计算(第3版)(王正林)04-3r.pdf

上传人:奔*** 文档编号:94345034 上传时间:2023-07-30 格式:PDF 页数:41 大小:5.38MB
返回 下载 相关 举报
精通MATLAB科学计算(第3版)(王正林)04-3r.pdf_第1页
第1页 / 共41页
精通MATLAB科学计算(第3版)(王正林)04-3r.pdf_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《精通MATLAB科学计算(第3版)(王正林)04-3r.pdf》由会员分享,可在线阅读,更多相关《精通MATLAB科学计算(第3版)(王正林)04-3r.pdf(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第 章MATLAB基本编程在 MATLAB中,除了可以在命令窗口中输入命令逐句执行外,也可以和其他形式的C、FORTRAN山空包等高级语言一样采用编程的方式,称为M 文件编程。读者首先应掌握MATLAB编程的基本方法,不断实践,逐步将其强大的功能应用到科学计算及其他领域的学习和应用中去。4.1MATLAB编程邀述MATLAB不仅是一种功能强大的高级语言,而且是一个集成的交互式开发环境,用户可以通过MATLAB提供的编辑调试器编写和调试MATLAB代码。MATLAB提供了代码书写和调试的集成开发环境,用户可以在MATLAB的代码编辑调试器中完成书写和调试过程。单击MATLAB主界面的“新建”工具

2、按钮或者单击文件菜单(File 新建子菜单New)的“M-File”项,就可以打开MATLAB代码编辑-调试器,其空白界面如图4-1所示。用户也可以在命令窗口通过edit filename命令打开已存在的M 文件进行编辑调试。从图4-1可 见,MATLAB能够根据M 文件内容区别是脚本M 文件还是函数M 文 件,并且在整个编辑过程中追踪光标位置(如图4-1底部的“Ln 1 Col 1”表示当前光标处在第一行的第一列),这对于准确快速定位当前编辑和修改位置是很方便的。开发MATLAB程序一般需要经历代码编写、调试、优化三个阶段。在编写代码时,要及时保存阶段性成果,可以通过File菜单的Save项

3、或者保存工具按钮保存当前的M 文件。完成代码书写之后,要试运行代码,看看有没有运行错误,然后根据针对性的错误提示对程序进行修改。运行脚本M 文 件,只需要在命令窗口中输入其文件名,然后按回车键,或通过Debug菜单的Run项,或按快捷键“F5”完成。运行函数M 文 件,需要通过命令窗口传递输入参数来调用。除了一些很简单的代码,大部分情况下用户都可能遇到程序报错的问题,这就 Editor-Untitled*I Ed;T.v+TAAI e n.h”,Tlevlr+cc Vi n精通MATLAB科学计算(第2忡-需要对代码进行调试纠错,一般需要通过Debug菜单下的子项辅助完成,包括设置断点、逐步运

4、行等项。当程序运行无误后,还要考虑程序性能是否可以改进。MATLAB提供了 M-Lint和 Profiler工 具,能够辅助用户分析代码运行中时间消耗的细节和可能需要改变的编程细节,如循环赋值前没有预定义数组,用循环去实现可以用数组函数实现的运算等。这些工具都在Tools菜单下设置了子菜单。4.2MATLAB编程的原则MATLAB编程的基本设计原则如下所述。百分号“”后面的内容是程序的注解,要善于运用注解使程序更具可读性。养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其他变量对程序运行的影响,但注意在子程序中不要用clear指令。参数值要集中放在程序的开始部分,以便维护。要充

5、分利用MATLAB工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间结果不在屏幕上显 示,以提高执行速度。input指令可以用来输入一些临时的数据;而对于大量参数,则通过建立一个存储参数的子程序,在主程序中通过子程序的名称来调用。程序尽量模块化,即采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。充分利用Debugger来进行程序的调试(如设置断点、单步执行、连续执行),并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设计结果集成到一起。设置好MATLAB的工作路径,以便程序运行。MATLAB程序的基本组成结构如下所示。MATLAB程序的基本组成结构%

6、说明清除命令:清除workspace中的变量和图形(clear,close)定义变量:包括全局变量的声明及参数值的设定逐行执行命令:指 MATLAB提供的运算指令或工具箱提供的专用命令控制循环:包含fbr,if then,switch,while等语句逐行执行命令56 第4章 MATLAB基本编程end绘图命令:将运算结果绘制出来当 然,更复杂的程序还需要调用子程序,或与其他应用程序相结合。57精通MATLAB科 学 计 算(第2蚪4.3M文件M 文件是包含MATLAB代码的文件。1.M 文件的类型M 文件按其内容和功能可以分为脚本M 文件和函数M 文件两大类。(1)脚本M 文件它是许多MAT

7、LAB代码按顺序组成的命令序列集合,不接受参数的输入和输出,与MATLAB工作空间共享变量空间。它一般用来实现一个相对独立的功能,比如对某个数据集进行某种分析、绘 图,求解某个已知条件下的微分方程等。用户可以通过在命令窗口中直接输入文件名来运行脚本M 文件。通过脚本M 文 件,用户可以把为实现一个具体功能的一系列MATLAB代码书写在一个 M 文件中,每次只需要输入文件名即可运行脚本M 文件中的所有代码。(2)函数M 文件它也是为了实现一个单独功能的代码块,但与脚本M 文件不同的是函数M 文件需要接受参数输入和输出,函数M 文件中的代码一般只处理输入参数传递的数据,并把处理结果作为函数输出参数

8、返回给MATLAB工作空间中的指定接收变量。因 此,函数M 文件具有独立的内部变量空间。在执行函数M 文件时,要指定输入参数的实际取值,而且一般要指定接收输出结果的工作空间变量。MATLAB提供的许多函数就是用函数M 文件编写的,尤其是各种工具箱中的函数,用户可以打开这些M 文件来查看。实际上,对于特殊应用领域的用户,如果积累了充分的专业领域应用的函数,就可以组建自己的专业领域工具箱了。通过函数M 文 件,用户可以把实现一个抽象功能的MATLAB代码封装成一个函数接口,在以后的应用中重复调用。2.M 文件的结构图 4-2显示的是MATLAB提供的一个函数M 文件的全部内容,图中清楚地显示了一般

9、的M 文件包括的各部分结构。从图4-2可以看到,MATLAB中 M 文件一般包括以下五部分结构。函数声明行(Function Definition Line),这一行只出现在函数M 文件的第一行,通过 function关键字表明此文件是一个函数M 文 件,并指定函数名、输入和输出参数,如图4-2中的第一行。58 第4章 MATLAB基本编程H 1行,这是帮助文字的第一行(the first help text line),给出M文件帮助最关键的信息。当用lookfor查找某个单词相关的函数时,k)okfor只在H 1行中搜索是否出现指定单词,如图4-2中的第2行。59精通MATLAB科学计算(

10、第2回图4-2 M 文件的一般结构 帮助文字,这部分对M 文件有更加详细地说明,经常解释M 文件实现的功能,M文件中出现的各变量、参数的意义,以及创作版权信息等。如图4-2中的第13行。当获取一个M 文件的帮助时,H 1行和帮助文字部分同时显示。M 文件正文,这是M 文件实现功能的MATLAB代码部分,通常包括运算、赋值等指令。图 4-2的例子中只有第16行,但一般都由多行组成。注释部分,这部分出现的位置比较灵活,主要是用来注释M 文件正文的具体运行过程,以方便阅读和修改,经常穿插在M 文件正文中间。图 4-2的例子中的第15行就是注释说明正文第16行的意义。注释一般都是针对接下来的一段正文代

11、码的,常见的M 文件中也经常包括多行注释。3.M 文件的创建虽然一般脚本M 文件可以包括上述五部分结构中除去 函数声明行”以外的四部分,但在实际应用中,脚本M 文件经常仅仅由M 文件正文和注释部分构成。正文部分实现功能,注释部分则给出每一块代码的功能说明。下面通过实例讲述脚本M 文件的创建。【例 4-1 M 文件创建实例。建立一个命令文件,将变量a,b的值互换。解:首先打开M 文件编辑器,输入以下程序:a=l:9;b=ll,12,13;14,15,16;17,18,19;c=a;a=b;b=c;ab然后保存文件名为“3 Lm”即完成了文件的建立。在 MATLAB的命令窗口中输入31,将会执行该

12、命令文件。3160 第 4章 MATLAB基本编程a=11 12 1314 15 1617 18 19b=1 2 3 4 5 6 7 8 9函 数 M 文件的命名一般习惯和函数名一致,比 如 图 42 中函数声明行functionT=now(),表明函数名为now,因此此函数M 文件一般保存为now.m,可以通过now()语句调用该文件;否 则,如果函数名和文件名不一致时,函数调用就需要通过文件名和与函数声明中对应的参数列表来实现。编写好的函数M 文 件,相当于MATLAB提供的命令,可以在命令行进行函数调用。但要注意,要求被调用的函数对应的.m 文件必须在MATLAB路径下。4.4MATLA

13、B程序流程控制和各种常见的高级语言一样,MATLAB也提供了多种经典的程序结构控制语句。MATLAB中的程序流程控制语句有:分支控制语句(if结构和switch结构 循环控制语句(for循环、while循环、continue语句和break语 句)和程序终止语句(return语 句),下面分别进行介绍。1.程序分支控制语句分支语句可以使程序中的一段代码只在满足一定条件时才执行,因此也成为分支选择。MATLAB中分支语句有两类:if语句和switch语句。if与 else或 elseif连 用,偏向于是非选择,当某个逻辑条件满足时执行if后的语句,否则执行else语句。switch和 case、

14、otherwise连 用,偏向于情况的列举,当表达式结果为某个或某些值时,执行特定case指定的语句段,否则执行otherwise语句。if结构的语法形式如下所示:if logical_expressionstatementselseif logical_expressionstatementselse logical_expressionstatementsend其中elseif和 else语句都是可选语句。if、elseif和 else构成的各项分支里面,哪个的条件满足(逻辑表达式logical_expression的结果为真),就执行哪个分支后面紧跟的程序语句。因 此,各个分支条件满足的

15、情况应该是互斥的和完全的,就是被选的条件在一个分支中成立,而且只能在一个分支中成立。61精通MATLAB科 学 计 算(第2回当 然,省略了 elseif和 else分支的语句,就不必要求分支条件满足的情况具备完全性了。if结构中条件判断除了可以用逻辑表达式外,还可以用数组A,这时判断相当于逻辑表达式all(A),即当数组A 的所有元素都为非零值时,才执行该条件后的分支代码。特别地,当数组A 为空数组时,相当于该条件判断为假。switch结构的语法形式如下所示:switch expressioncase valuel(scalar or string)statementscase value2

16、statementsotherwisestatementsend%Executes if expression is valuel%Executes if expression is value2%Executes if expression does not%match any case执行中,先计算表达式expression的 值,当结果等于某个case的 value时,就执行该case紧随的语句。如果所有case的 value都和expression计算结果不相等,则执行otherwise后面紧随的语句。otherwise语 句 是 可 选 的,当 没 有 otherwise语 句 时,

17、如果所有case的 value都和expression计算结果不相等,则跳过switch-case语句段,直接执行后续代码。相等的意义,对于数值类型来说,相当于判断ifresult=value”,对于字符串类型来说,相当于判断if strcmp(result,valued由此可见,switch-case语句实际上可以被if-elseif-else语句等效替换,不过两种结构各有更便利的地方,读者在以后的例子中会逐渐体会到。学过C 语言的读者需要注意,MATLAB中的switch-case结 构,只执行表达式结果匹配的第一(b case分 支,然后就跳出switch-case结构。因 此,在每一个

18、case语句中不需要用 break语句跳出。在一条case语句后可以列举多个值,只需要以元胞数组的形式列举多个值,就是用花括号把用逗号或空格分隔的多个值括起来即可。2.程序循环控制语句循环控制语句能够使得某段程序代码多次重复执行,MATLAB中提供了两类循环语句,分别是for循环和while循 环:for循环一般用在已知循环执行次数的情况。while循环则用在已知循环退出条件的情况。62 -第 章 MATLAB基本编程MATLAB还提供了 continue和 break语 句,用于更精细地控制循环结构:continue语句使得当前次循环不向下执行,直接进入下一次循环。break语句则是退出该循

19、环。(1)fo r循环for循环用于知道循环次数的情况,其语法格式如下所示:for index=start:increment:endstatementsendindex为循环变量,increment为增量,end用于判断循环是否应该终止。增量 increment默认值为1 ,可以自由设置;当增量为正数时,循环开始先将index赋值为start,然后判断 index是否小于等于end,若 是,则执行循环语句,执行完后,对 index累加一个增量increment;再判断index是否小于等于end,若 是,则继续执行循环语句,继续对index累加,循环往复,直到index大于end时退出循环。

20、增量increment也可以设置为负整数,表示每次循环执行后对循环变量index进行递减,当 index小于end时,退出循环。MATLAB中,循环的执行效率很低,提高程序效率的一个办法就是多采用数组结构和 MATLAB内联函数。for循环中的循环变量index也可以赋值为数组A,那么在第一次循环中index就被赋值为A(:,l),即 A 的第一列元素,第二次循环index被赋值为A(:,2),以此类推;若A 有列元素,则循环执行次,第“次循环时,循环变量index被赋值为A(:,)。(2 )while 循环while循环用于已知循环退出条件的情况,其语法形式如下所示:while expres

21、sionstatementsend当表达式expression的结果为真时,就执行循环语句,直到表达式expression的结果为 假,才退出循环。如果表达式expression是一个数组A,则相当于判断all(A)o特 别 地,空数组则被当作逻辑假,循环停止。(3)continue 语句continue语句用在循环中,表示当前次循环不再继续向下执行,而是直接对循环变量进行递增,进入下一次循环。63精通MATLAB科学计算(第2版i-(4)break 语句break语句用于退出循环。3.程序终止控制语句一般程序代码都是按流程执行完毕后正常退出,但当遇到某些特殊情况,程序需要立即退出时,就可以用

22、return语句提前终止程序运行。【例 4-2 return语句使用实例。clearclcn=2;if nmysubfun命令来获取子函数mysubfun的帮助。5.私有函数私有函数是具有限制性访问权限的函数,它们对应的M 文件需要保存在名为“private”的文件夹下,这些私有函数在代码编写上和普通的函数没有什么区别,也可以在一个M文件中编写一个主函数和多个子函数,以及嵌套函数。但私有函数只能被private目录的直接父目录下的脚本M 文件或M 文件主函数调用。通过help命令获取私有函数的帮助,也需要声明其私有特点,例如要获取私有函数myprifun 的帮助,就要通过 help priva

23、te/myprivfun 命令。6.重载函数“重载”是计算机编程中非常重要的概念,它经常用在处理功能类似但参数类型或个数不同的函数编写中。67精通MATLAB科学计算(第 2 忡-例 如,现在要实现一个计算功能,一种情况是输入的几个参数都是双精度浮点类型,同时也有一种情况是输入的几个参数都是整型变量,这时候,用户就可以编写两个同名函数,一个用来处理双精度浮点类型的输入参数,另一个用来处理整型的输入参数,这 样,当用户实际调用函数时,MATLAB就会根据实际传递的变量类型选择执行其中一个函数。MATLAB中重载函数通常放置在不同的文件夹下,通常文件夹名称以符号 开头,然后跟一个代表MATLAB数

24、据类型的字符。例如“double”目录下的重载函数的输入参数应该是双精度浮点型,而 int32”目录下的重载函数的输入参数应该是32位整型。4.5.2函数参数传递MATLAB中通过M 文件编写函数时,只需要指定输入和输出的形式参数列表,只是在函数实际被调用的时候,才需要把具体的数值提供给函数声明中给出的输入参数。MATLAB中参数传递过程是传值传递,也就是说,在函数调用过程中,MATLAB将传入的实际变量值赋给形式参数指定的变量名,这些变量都存储在函数的变量空间中,这和工作空间、变量空间是独立的,每一个函数在调用中都有自己独立的函数空间。例 如,编写函数:function y=myfun(xz

25、 y,z)在命令窗口通过a=myfun(3,2,0.5)调用此函数,那么MATLAB首先会建立myfun函数的变量空间,把 3 赋值给x,把 2 赋值给y,把 0.5赋值给z,然后执行函数实现的代码;执行完毕后,把 myfun函数返回的参数y 的值传递给工作空间变量。,调用过程结束后,函数变量空间被清除。1.输入和输出参数的数目MATLAB的函数可以具有多个输入或输出参数。通常在调用时,需要给出和函数声明语句中一一对应的输入参数;而输出参数个数可以按参数列表对应指定,也可以不指定。不指定输出参数调用函数时,MATLAB默认把输出参数列表中第一个参数的值返回给工作空间变量“an$MATLAB中可

26、以通过nargin和 nargout函数确定函数调用时实际传递的输入和输出参数个数,结合条件分支语句,就可以处理函数调用中指定不同数目的输入输出参数的情况。【例 4Y】显示函数输入和输出参数的数目实例。function yl,y2=mytestnio(xlz x2)if nargin=lyl=xl;68 第 4章 M A T L A B 基本编程if nargout=2y2=xl;endelseif nargout=lyl=xl+x2;elseyl=xl;y2=x2;endend这个函数可以处理一个或两个输入参数、一个或两个输出参数的情况。当只有一个输入参数X1和一个输出参数y l 时,把 X

27、1赋 值 给;当 有 1个输入参数X1和两个输出参数贝、以时 把打赋值给.1和y2;当有两个输入参数xl、x2和一个输出参数囚时把xl+x2的计算结果赋值给训;当有两个输入参数xl、x2和两个输出参数网、以 时,把 xl赋值给yl,并把x2赋值给了2。函数调用结果如下所示。x=mytestnio(5)x=5 xz y=mytestnio(5)x=5y=5 mytestnio(5)ans=5 x=mytestnio(5,7)x=12 xz y=mytestnio(5,7)x=5y=7 mytestnio(5,7)ans=5指定了输入和输出参数个数的情况比较好理解,只要对应函数M 文件中对应的if

28、分支项即可;而不指定输出参数个数的调用情况,M A T L A B 是按照指定了所有输出参数的调用格式对函数进行调用的,不过在输出时只是把第一个输出参数对应的变量值赋给工作空间变量“an&例如mytestnio(5,7)”这句函数调用中,实际上是按照 1 丁 2=1必 6$而0(_1,X2)”这种形式调用的,在函数变量空间中xl被赋值为5,x2被赋值为7,贝计算结果为5计算结果为7,但函数只把输出参数列表中第一个输出变量(即j,l )的取值返回给工作空间变量ans,因 此,ans取值为5。2.可变数目的参数传递函数nargin和 nargout结合条件分支语句,可以处理可能具有不同数目的输入和

29、输出参数的函数调用,但这要求对每一种输入参数数目和输出参数数目的组合分别进行代码编写。69精通MATLAB科学计算(第2忡-有些情况下,用户可能并不能确定具体调用中传递的输入参数或输出参数的个数,即具有可变数目的传递参数,MATLAB中可以通过varargin和 varargout函数实现可变数目的参数传递,使用这两个函数对于处理具有复杂的输入输出参数个数组合的情况也是便利的。函数varargin和 varargout把实际的函数调用时传递的参数值封装成一个元胞数组,因此,在函数实现部分的代码编写中,就要用访问元胞数组的方法访问封装在varargin或varargout中的元胞或元胞内的变量。

30、【例 4-5】可变数目的参数传递实例。function y=mytestvario(varargin)temp=0;for i=l:length(varargin)temp=temp+mean(varargini(:);endy=temp/length(varargin);本例中的函数mytestvario以 varargin为输入参数 从而可以接受可变数目的输入参数。函数实现部分首先计算了各个输入参数(可能是标量、一维数组或二维数组)的均值,然后计算这些均值的均值。调用结果如下所示。mytestvario(4)ans=4 mytestvario(4f 1 3)ans=3 mytestvari

31、o(4,1 3,1 23;23 1,magic(4)ans=6.6250对于“mytestvario(4,l 3,1 23;23 l,magic(4)”这句函数调用,在函数变量区,varargin首先被赋值为一个元胞数组4,1 3,1 23;23 l,magic(4),即 varargin有 1行 4 列个元胞,各个元胞中分别存储了一个标量数值、一维行数组、2 行 2 列的二维数组和4 行 4 列的魔方数组;在函数实现部分,首先创建中间变量temp,并初始化赋值为零(用来存储各个元胞中数据均值的总和),然后计算每一个元胞中所有数据的均值并将结果累加到temp上;最后通过后temp/length

32、(varargin)”计算这些均值的均值。函数varargin和 varargout也可以放置在参数列表中某些必然出现的参数之后,其语法格式有如下几种形式。1 )function out 1,out2=example 1 (a,b,varargin),表示函数 example 1 可以接受大于等于两个输入参数,返回两个输出参数;两个必选的输入参数是“和 6,其他更多的输入参数被封装在varargin中。2)function i,j,varargout=example2(x,y),表示函数 example?接受两个输入参数 x和y,返回大于等于两个输出参数,前两个输出参数为,和,其他更多的输出参

33、数封装在varargin 中。70 A A A A-第 章 MATLAB基本编程函数varargout和 varargin的用法类似 只需要注意访问时应按照访问元胞数组的方法,这里就不再举例了。3.返回被修改的输入参数MATLAB函数有独立于MATLAB工作空间的自己的变量空间,因 此,输入参数在函数内部的修改都只具有和函数变量空间相同的生命期,如果不指定将修改后的输入参数值返回到工作空间,那么在函数调用结束后这些修改后的值将被自动清除。【例 4-6】函数内部的输入参数修改实例。function y=mytest(x)x=x+5;y=x*2;本例中的mytest函数内部,首先修改了输入参数x

34、的值(x=x+5),然后以修改后的x的值计算输出参数了的值(j=x*2调用结果如下所示。x=3x=3 y=mytest(x)y=16 xx=3由此结果可见,调用结束后,函数变量区中的X在函数调用中被修改,但此修改只在函数变量区有效,这并没有影响到MATLAB工作空间变量空间中变量x 的值。函数调用前 后,MATLAB工作空间中的变量x 始终取值为3O那 么,如果用户希望函数内部对输入参数的修改也对MATLAB工作空间的变量有效,就需要在函数输出参数列表中返回此输入参数。对于本例中的函数,则需要把函数修改为function ytx=mytest(x)I而在调用时也要通过LFXI=mytest(x

35、)这种形式。【例 4-7 函数参数传递实例。将修改后的输入参数返回给MATLAB工作空间。function y,x=mynewtest(x)x=x+5;y=x*2;MATLAB工作空间中的调用结果如下所示。x=3x=3 y,x=mynewtest(x)y=16x=8 x 71精通MATLAB科学计算(第2版i-x=8通过本例可见,函数调用后,MATLAB工作空间中的变量x 取值从3 变为8(3+5),可见通过yx=mynewtest(x)调 用,实现了函数对MATLAB工作空间变量的修改。4.全局变量通过返回修改后的输入参数,可以实现函数内部对MATLAB工作空间变量的修改。而另一种殊途同归的

36、方法则是使用全局变量。声明全局变量需要用到global关键词,语法格式为global variable通过全局变量可以实现MATLAB工作空间、变量空间和多个函数的函数空间的共享,这 样,多个使用全局变量的函数和MATLAB工作空间共同维护这一全局变量,任何一处对全局变量的修改,都会直接改变此全局变量的取值。在应用全局变量时,通常在各个函数内部通过global variable语句声明,在命令窗口或脚本M 文件中也要先通过global声 明,然后进行赋值和调用。【例 4-8】全局变量使用实例。function y=myprocess(x)global TT=T*2;y=exp(T)*sin(x

37、);在命令窗口中声明全局变量然后赋值调用。global T T=0.3T=0.3000 myprocess(pi/2)ans=1.8221 exp(T)*sin(pi/2)ans=1.8221 TT=0.6000通过本例可见,用 global将 T 声明为全局变量后,函数内部对T 的修改也会直接作 用 到 MATLAB工作空间中。函 数 myprocess调 用 一 次 后,T 的 值 从 0.3变 为 0.6(0.3*2)o72 第4章 M A T L A B基本编程4.6函数句柄函数句柄实际上提供了一种间接调用函数的方法。创建函数句柄需要用到操作符。前面已经讲过,匿名函数实际上就是一种函数

38、句柄,而对M A T L A B提供的各种M文件函数和内部函数,也都可以创建函数句柄,从而可以通过函数句柄对这些函数实现间接调用。函数句柄的优点如下:(1)方便地实现函数间互相调用(2)兼容函数加载的所有方式(3)拓宽子函数,包括局部函数的使用范围(4)提高函数调用的可靠性(5)减少程序设计中的冗余(6)提高重复执行的效率创建函数句柄的一般语法格式如下所示:fhandle=function_fileame其 中,funciont_filename”是函数所对应的M文件的名称或M A T L A B内部函数的名称;”是句柄创建操作符;“fhandle”变量保存这一函数句柄。例如fhandle=s

39、in就创建了 M A T L A B内部函数sin的句柄,并将其保存在(handle变量 中,以后就可以通过fhandle(x)来实现sin(x)的功能。通过函数句柄调用函数时,也需要指定函数的输入参数,比如可以通过fhandle(argl,a r g 2,a r g”)这样的调用格式来调用具有多个输入参数的函数。对于那些没有输入参数的函 数,在使用句柄调用时,要在句柄变量后加上空的圆括号,即fhandle()o【例4-9】函数句柄创建和调用实例。fhd=0sinfhd=0sin x=0:0.25*pi:2*pi;fhd(x)ans=0 0.7071 1.0000 0.7071 0.0000-

40、0.7071-1.0000-0.7071-0.0000M A T L A B中提供了丰富的处理函数句柄的函数,如表4.1所示。表4.1处理函数句柄的函数函 数说 明 73精通MATLAB科学计算(第 2 回functions(fhandle)返回一个结构体,存储了函数的名称,函数类型(简单函数或重载函数),以及函数M文件的位置续表函 数说 明func2str(fhandle)将函数句柄转换为函数名称字符串str2fiinc(str)将字符串代表的函数转换为函数句柄save filcnamc.mat fhandlc将函数句柄保存在.mai文件中load filename.mat fhandle把

41、.mal文件中存储的函数句柄装载到工作空间isa(var,function handle)检测变量var是不是函数句柄isequal(fhda,flidb)检测两个函数句柄是否对应于同一个函数feva 1(fhandle)调用函数句柄(handle【例 4-10处理函数句柄的函数使用实例。fhda=expfhda=exp fhdb=Gmyprocessfhdb=Qmyprocess functions(fhdb)ans=function:fmyprocesstype:*simplefile:1D:MATLAB71orkMATLABbookEX-10myproc。isa(fhda,functio

42、n_handle)ans=1 isequal(fhda,fhdb)ans=04.7MATLAB程序调试MATLAB程序出错主要为两类:格式错误,如缺(或,等,在运行时可检测出大多数该类错误,并指出错在哪一行。算法错误,逻辑上的错误,不易查找,遇到此类错误时需耐心。一般可考虑如下方法:删除句尾分号,显示中间结果;在适当位置加上keyboard语 句,使程序暂停;在函数定义行之前加上,注释掉,使之变成脚本语言;使用MATLAB调试器,设置断点,或单步执行,使用一些调试和分析工具。下面讲述程序调试的一些工具及调试方法,熟练掌握并运用这些工具及调试方法,能提高编程的效率。4.7.1调试方法74 MAT

43、LAB程序有直接调试法和工具调试法两种。第 4章 MATLAB基本编程 75精通MATLAB科学计算(第2版i-(1 )直接调试法直接调试法就是在M 文件中,将某些语句后面的分号去掉,迫使M 文件输出一些中间计算结构,以便发现可能的错误。常用的做法有:1 )在适当位置,添加显示某些关键变量值的语句;2)利用echo指 令,使运行时在屏幕上逐行显不文件内容,echo on能显不M 脚本文件;echo FunName O n能显示名为FunName的 M 函数文件;3)在 原 M 脚本或函数文件的适当位置,添加指令keyboard,keyboard语句可以设置程序的断点;4)通过将原M 函数文件的

44、函数声明行注释掉,可使一个中间变量难于观察的M 函数文件变为一个所有变量都保存在基本工作空间中的M 脚本文件。(2)工具调试法工具调试法就是在程序中设置一些断点,利用调试菜单(Debug)中的一些选项进行调试。Debug菜单用于程序调试,需要与Breakpoints菜单项配合使用。MATLAB 7 的 Debug菜单中的菜单项介绍如下。Open M-Files when Debugging:用于调试时打开M 文件 Step:用于单步调试程序 Step In:用于单步调试进入子函数。Step Out:用于单步调试从子函数跳出 Continue:程序执行到下一断点 Clear Breakpoint

45、s in All Files:清除所有打开文件中的断点 Stop if Enors/Wamings:在程序出错或报警处停止往下执行 Exit Debug Mode:退出调试模式除了采用调试器调试程序外,MATLAB还提供了一些命令用于程序调试。命令的功能和调试器菜单命令类似。MATLAB提供的调试命令介绍如下。快捷键F10:实现单步调试 快捷键F11:用于单步调试进入子函数 快捷键Shift+Fll:用于单步调试从子函数跳出 快捷键F5:实现程序执行到下一断点MATLAB提供了进行代码调试和代码分析优化的工具,一般的MATLAB用户都应该对这些工具有所了解。尤其是断点调试部分的内容,建议读者尽

46、量以自己的程序代码为例,多加练习,熟练掌握。76 -第 章 MATLAB基本编程4.7.2调试工具当完成MATLAB代码编写后,用户就可以在命令窗口中运行代码(脚本或函数文件卜对于比较简单的代码,一般只要编程习惯较好,都可以一次通过。但对于很多比较复杂的情况,或者用户初学MATLAB编 程,一些常见的错误还不能避免,就容易在运行时出现错误。这时候,就需要利用MATLAB的调试工具对出现错误的代码进行调试纠错。MATLAB的代码编辑调试器是一个综合了代码编写、调试的集成开发环境。MATLAB代码调试过程,主要是通过MATLAB代码编辑-调试器的Debug菜单下的子项进行的,如图 4-3所示。De

47、bug desktop WindowB Open M-Files when DebuggingStep F10Step Jn FilStep Out Shit+FllRun F5Go Until QursorSet/Clear Brealqoint F12Set/Modify Conditional Breakpoint.ntbl/Disable BrtkpointClear Breakpoints in All FilesStop i f Errors/Iarnings.Exi t Debug Mode图4-3 MATLAB代码编辑-调试器的Debug菜单Debug菜单下各子项的含义介绍如下

48、。1 )Step:在调试模式下,执 行 M 文件的当前行,对应的快捷键是FlOo2)Step In:在调试模式下,执行M 文件的当前行,如果M 文件当前行调用了另一个函 数,那么进入该函数内部,对应的快捷键是F11。3)Step Out:当在调试模式下执行Step In进入某个函数内部之后,执 行 Step Out可以完成函数剩余部分的所有代码,并退出函数,暂停在进入函数内部前的M 文件所在行末尾。4)Run:运行当前M 文 件,快捷键是F5;当前M 文件设置了断点 时,运行到断点处暂停。5)Go Until Cursor:运行当前M 文件到光标所在行的行尾。需要注意的是,以上这些调试项,除了

49、 Run(运 行),都需要首先在M 文件中设置断点,然后运行到断点位置后,这些调试项才可启用。6)Set/Clear Breakpoint:在光标所在行开头设置或清除断点。7)Set/Modify Conditional Breakpoint.:在光标所在行开头设置或修改条件断点,选择此子项,会打开“条件断点设置”对 话 框,如图4-4所 示,用于设置在满足什么条件 时,此处断点有效。77精通MATLAB科 学 计 算(第2蝌图4-4 条件断点设置”对话框8)Enable/Disable Breakpoint:将当前行的断点设置为有效或无效。9)Clear Breakpoints in All

50、 Files:清除 M 文件中所有的断点。10)Stop if Errors/Warnings.:设置出现某种运行错误或警告时,停止程序运行,选择此子项,会打开 错误警告设置 对话框,如图4-5所示。图4-5 设置出现某种运行错误或警告则停止程序运行11)Exit Debug Mode:退出调试模式。上面逐项讲述了 Debug菜单下每一个子项的意义,实际上,很多子项都有对应的快捷工具按钮。在 MATLAB代码编辑-调试器中,如图4-6所示的部分工具按钮就是用于M 文桓幻归K图4-6 调试工具按钮件调试的。图 4-6中的各个工具按钮,从左向右依次对应于Set/ClearBreakpointCle

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁