第八章程序设计.ppt

上传人:李司机 文档编号:4103180 上传时间:2023-04-04 格式:PPT 页数:47 大小:247KB
返回 下载 相关 举报
第八章程序设计.ppt_第1页
第1页 / 共47页
第八章程序设计.ppt_第2页
第2页 / 共47页
第八章程序设计.ppt_第3页
第3页 / 共47页
第八章程序设计.ppt_第4页
第4页 / 共47页
第八章程序设计.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《第八章程序设计.ppt》由会员分享,可在线阅读,更多相关《第八章程序设计.ppt(47页珍藏版)》请在三一办公上搜索。

1、第八章 M文件程序设计基础,M文本编辑器M文件MATLAB的数据类型MATLAB控制流程序调试函数句柄,一、M文件,M脚本(命令)文件M函数文件局部变量和全局变量M文件的一般结构变量的检测传递和限权使用函数,1、M脚本(命令)文件(Script),“脚本”本身反映这样一个事实:MATLAB只是按文件所写的指令执行。M脚本(命令)文件的构成较简单,其特点是:它只是一串按用户意图排列而成的(包括控制流向指令在内的)MATLAB指令集。脚本文件运行后,所产生的所有变量都驻留在MATLAB基本工作空间(Base workspace)中。只要不使用clear指令加以清除,且MATLAB指令窗不关闭,这些

2、变量将一直保存在基本工作空间中。基本工作空间随MATLAB的启动而产生;只有关闭MATLAB时,该基本空间才被删除。,2、M函数文件(Function),与脚本(命令)文件不同,函数文件(Function file)犹如一个“黑箱”。从外界只能看到传给它的输入量和送出来的计算结果,而内部运作是藏而不见的。,函数文件的特点:,从形式上看,与脚本文件不同,函数文件的第一行总是以“function”引导的“函数申明行”(Function declaration line)。该行还罗列出函数与外界联系的全部“标称”输入输出宗量。但对“输入输出宗量”的标称数目并没有限制,即可以完全没有输入输出宗量,也可

3、以是任意数目。MATLAB允许使用比“标称数目”较少的输入输出宗量,实现对函数的调用。从运行上看,与脚本文件运行不同,每当函数文件运行,MATLAB就会专门为它开辟一个临时工作空间,称之谓函数工作空间(Function workspace)。所有中间变量都存放在函数工作空间中。当执行完文件最后一条指令或遇到return时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量就立即被清除。函数空间随具体M函数文件的被调用而产生,随调用结束而删除。函数空间是相对独立的、临时的。在MATLAB整个运行期间,可以产生任意多个临时函数空间。假如在函数文件中,发生对某脚本文件的调用,那么该脚本文件

4、运行产生的所有变量都存放于该函数空间之中,而不是存放在基本空间。,3、局部变量和全局变量,局部(Local)变量它存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于该函数本身。全局(Global)变量通过global指令,MATLAB也允许几个不同的函数空间以及基本空间共享一个变量。这种被共享的变量称为全局变量。每个希望共享全局变量的函数或MATLAB基本工作空间,必须逐个用global对具体变量加以专门定义。没采用global定义的函数或基本空间,将无权享用全局变量。如果某个函数的运作使全局变量的内容发生了变化,那么其他函数空间以及基本工作空间中的同名变量也就随之变化

5、。除非与全局变量联系的所有工作空间都被删除,否则全局变量依然存在。例,4、M文件的一般结构,由于从结构上看,脚本文件只是比函数文件少一个“函数申明行”。典型M函数文件的结构:函数申明(定义)行(Function declaration line):H1行(The first help text line):在线帮助文本(Help text)区:编写和修改记录:函数体(Function body):M函数文件示例,函数申明(定义)行(Function declaration line):,位于函数文件的首行,以MATLAB关键字function开头,函数名以及函数的输入输出宗量都在这一行定义。,

6、H1行(The first help text line):,紧随函数申明行之后以%开头的第一注释行。按MATLAB自身文件的规则,H1行包含:大写体的函数文件名;运用关键词简要描述的函数功能。该H1行供lookfor关键词查询和help在线帮助使用。,在线帮助文本(Help text)区:,H1行及其之后的连续以%开头的所有注释行构成整个在线帮助文本。它通常包括:函数输入输出宗量的含义,调用格式说明。,编写和修改记录:,与在线帮助文本区相隔一个空行,也以%开头,标志编写及修改该M文件的作者和日期、版本记录。它用于软件档案管理。,函数体(Function body):,为清晰起见,它与前面的注

7、释行以空行相隔。这部分内容由实现该M函数文件功能的MATLAB指令组成。它接收输入宗量,进行程序流控制,得到输出宗量。其中为阅读、理解方便,也配置适当的空行和注释。若仅从运算角度看,惟有函数申明行和函数体两部分是构成M函数文件所必不可少的。,5、变量的检测传递和限权使用函数,输入输出宗量检测指令跨空间变量传递子函数和私用函数,输入输出宗量检测指令,nargin在函数体内,用于获取实际输入宗量nargout在函数体内,用于获取实际输出宗量nargin(fun)获取fun指定函数的标称输入宗量数nargout(fun)获取fun指定函数的标称输出宗量数inputname(n)在函数体内使用,给出第

8、n个输入宗量的实际调用变量名,跨空间变量传递,跨空间计算串表达式的值跨空间赋值,跨空间计算串表达式的值,前面已介绍了实现不同工作空间之间变量传递的两种渠道:函数的输入输出宗量和全局变量。下面介绍第三个传递渠道:跨空间计算串表达式值的指令。evalin(workspace,expression)跨空间计算串表达式值说明:workspace可取两个值:base和caller该调用格式的执行机理:当workspace取base表示计算eval(expression)时,将从基本工作空间获得变量值。当workspace取caller表示计算eval(expression)时,将从主调函数工作空间获得变

9、量值。主调函数是相对被调函数而言的。这里,被调函数是指evalin所在的函数。,evalin(workspace,expression1,expression2)跨空间计算替代串表达式值说明:workspace可取两个值:base和caller该调用格式的执行机理:先从所在函数空间获得变量值用eval(expression1)计算原串表达式;若该计算失败,则在从workspace 指定的(基本或主调函数)工作空间获取变量值,再通过eval(expression2)计算替代串表达式。例:evalin运行机理与eval的异同。,跨空间赋值,实现不同工作空间之间变量传递的第四个传递渠道是跨空间赋值指

10、令:assignin(workspace,VN,x)跨空间向VN变量赋值说明:把当前工作空间内变量x的值赋给workspace指定空间名的VN变量。例:assignin运作机理示范,子函数和私用(局部)函数,子函数私用(局部)函数,子函数,MATLAB允许一个M函数文件包含多个函数的代码。其中,第一个出现的函数称为主函数(Primary function),该文件中的其他函数称为子函数(Subfunction)。保存时所用的函数名与主函数定义名相同。外部程序只能对主函数进行调用。子函数的性质:,子函数的性质:,每个子函数的第一行是其自己的函数申明行。在M函数文件内,主函数的位置不可改变,但子函

11、数的排列次序可任意改变。子函数只能被处于同一文件的主函数或其他子函数调用。在M函数文件中,任何指令通过“名字”对函数进行调用时,子函数的优先级仅次于内装函数。同一文件的主函数、子函数的工作空间都是彼此独立的。各函数间的信息,或通过输入输出宗量传递,或通过全局变量传递,或通过跨空间指令传递。help,lookfor等帮助指令都不能提供关于子函数的任何帮助信息。涉及子函数的算例。,私用(局部)函数,所谓私用(局部)函数,是指位于private目录上的M文件函数。私用(局部)函数的性质:私用(局部)函数的构造与普通M函数完全相同。私用(局部)函数的只能被private目录的直接父目录上的M函数文件所

12、调用。它不能被其他目录上的任何M函数、M脚本文件或MATLAB指令窗中的命令所调用,也不能被直接父目录上的M脚本文件调用。M文件中,任何指令通过“名字”对函数进行调用时,私用(局部)函数的优先级虽低于内装函数和子函数,但高与其他任何目录上的函数。help,lookfor等指令都不能提供关于私用(局部)函数的任何帮助信息。,二、MATLAB的数据类型,6种基本数据类型及若干衍生类型。,数据文件,MATLAB允许接受的数据文件大致可分为以下几类:以.mat为扩展名的二进制数据文件。以.txt、.dat为扩展名的ASCII码数据文件。以.bmp、.jpg、.tif等为扩展名的图像文件。以.wav为扩

13、展名的声音文件。P192/表8-3,三、MATLAB控制流,for循环结构while循环结构 if-else-end分支结构 switch-case结构 try-catch结构 控制程序流的其它常用指令,1、for循环结构,for x=array(commands)end,For循环的结构以及含义和其他高级语言的结构和含义基本一致。一个简单的for循环示例。和其他语言一样for循环可以有多重循环。,2、while循环结构,while expression(commands)end,与for循环设置固定循环次数来执行循环体相比较,MATLAB中的while循环是应用逻辑表达式来设置与判断是否执行

14、循环体,循环次数依逻辑判断条件来决定,循环次数是不固定的。例:Fibonacci数组的元素满足Fibonacci规则:a k+2=ak+ak+1,(k=1,2,);且a1=a2=1。现要求该数组中第一个大于10000的元素。,3、if-else-end分支结构,if-else-end指令为程序流提供了一种分支结构,它最常用的使用方式:,例,一个简单的分支结构两个分支结构多分支结构:设某批发贸易公司从事苹果批发,当客户购买5000件以上,15元/件;25005000件,16元/件;10002500件,17元/件;5001000件,18元/件;250500件,19元/件;100250件,20元/件

15、;50100件,22元/件;1050件,24元/件;9件以下,28元/件。试编写程序根据客户购买的件数,求出总的 金额数。,4、switch-case结构,switch ex case test1(commands1)case test2(commands2)case testk(commandsk)otherwise(commands)end,例:学生成绩管理,用来演示switch结构的应用。,5、try-catch结构,try(commands1)组命令1总被执行。若正确,则跳出此结构catch(commands2)仅当组命令1出现执行错误,组命令2才被执行end,try-catch结构应

16、用实例。,6、控制程序流的其它常用指令(1),控制程序流的其它常用指令(2),break语句,break语句用来退出for循环和while循环。注意:break只用在if判断语句和while循环判断语句中,break可以中断if和while语句的执行,退出for循环或while循环,执行循环结束标志end后面的语句。例:用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。,echo命令,通常运行一个M文件时,文件中的命令不在屏幕上显示出来。如果M文件被执行之前,首先在MATLAB命令窗中输入echo命令并予以执行,然后再运行M文件,则M文件中的程序将在MATLAB命令窗中显

17、示出来,但影响程序的执行速度。若要清除echo命令的影响,在MATLAB命令窗中键入“echo off”并回车即可。,Input()语句,Input()语句用在M文件中,执行到input()命令时,MATLAB暂停程序的执行,等待用户用键盘赋值给input()指定的变量。Input()语句还可用于等待用户输入MATLAB表达式和字符串,跟其他语句配合,可以实现“菜单”的功能。不过MATLAB中有专用的菜单设置命令,一般并不使用input()来建立。,keyboard命令,类似于input()但功能更强的keyboard命令是等待键盘输入内容,并把键盘输入的内容作为一个M文件来调用。例如,建立一

18、个M文件us.m:x=0:0.01*pi:2*pi;keyboard执行us.m,计算机返回一个提示符:k此时,可以输入一个函数,但要注意这个函数自变量和因变量的对应关系。return命令返回正常状态,表示增加输入的文本内容输入完毕,这一条命令是必须的。,四、程序调试与优化,程序调试概述一般调试技巧程序调试器的使用程序设计的优化M文件调用记录,程序调试概述,MATLAB的调试器(Debugger)可以迅速地帮您找出程序错误所在,其功能包含:查询每一个函数的工作空间(Workspace).显示函数调用的堆栈(Function Call Stack).一行一行地执行M文件.,一般调试技巧,一般而言

19、,计算机程序可能发生的错误可分为两种:语法错误(Syntax Errors)逻辑错误(Logic Errors)一般检测逻辑错误的方法:删除表达式最尾端的分号。若调试一个单独函数,可在其第一行的函数申明行加上%,并定义输入变量的值,直接以脚本的方式来执行此M文件,并保留所有变量于MATLAB工作空间中,以便后续查看及调试。在程序中加入keyboard命令,可使程序执行至此处即暂停,并显示“k”的提示号。此时可任意查看或改变工作空间的任何变量。若要继续执行程序,可在命令窗输入“return”并按下Enter键。使用MATLAB程序调试器。,程序调试器的使用,M文本编辑器事实上就是调试器,包含了一

20、系列的调试图标。更多的调试选项,则出现在工具栏的debug下拉式菜单中。调试器调试程序的一般步骤:(P207),程序设计的优化,以矩阵运算代替循环运算数据的预定义内存的管理,M文件调用记录,通过记录M文件调用过程,可以分析执行过程中各函数的耗时情况,依此可以了解文件执行过程中的瓶颈问题。通过M文件记录可以避免许多程序设计中不必要的冗余以及时间耗费。,五、函数句柄,函数句柄(Function handle)是MATLAB6.0版启用的新数据类型。它保存着“为该函数创建句柄时的路径、视野、函数名,以及可能存在的重载方法”。引入函数句柄的理由(优点):(P212),函数句柄的创建和观察,函数句柄并不

21、是伴随函数文件而自动形成的文件“属性”,是必须通过专门的定义才会生成的。为一个函数定义句柄的方法有两种:利用符号;利用转换函数str2func。对函数句柄的内涵观察需借助专门指令Functions实现。例:为MATLAB的“内建”函数创建函数句柄,并观察其内涵。,函数句柄的基本用法,介绍:如何通过函数句柄执行相应函数的计算。假设,一个函数的调用格式为:argout1,argout2,argoutn=FunName(argin1,argin2,arginn)又假设该函数的句柄通过以下指令获得:Hfun=FunName;那么通过函数句柄实现函数运算的调用格式是:argout1,argout2,argoutn=feval(Hfun,argin1,argin2,arginn)例:本例通过sin(/4)函数及其句柄演示若干基本用法。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号