精通MATLAB科学计算(第3版)(王正林)04-3r.pdf
《精通MATLAB科学计算(第3版)(王正林)04-3r.pdf》由会员分享,可在线阅读,更多相关《精通MATLAB科学计算(第3版)(王正林)04-3r.pdf(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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中可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精通 MATLAB 科学 计算 王正林 04
限制150内