单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第八章,M,文件程序设计基础,M,文本编辑器,M,文件,MATLAB,的数据类型,MATLAB,控制流,程序调试,函数句柄,一、,M,文件,M,脚本(命令)文件,M,函数文件,局部变量和全局变量,M,文件的一般结构,变量的检测传递和限权使用函数,1,、,M,脚本(命令)文件(,Script),“,脚本”本身反映这样一个事实:,MATLAB,只是按文件所写的指令执行。,M,脚本(命令)文件的构成较简单,其,特点,是:,它只是一串按用户意图排列而成的(包括控制流向指令在内的),MATLAB,指令集。,脚本文件运行后,所产生的所有变量都驻留在,MATLAB,基本工作空间,(,Base workspace),中。只要不使用,clear,指令加以清除,且,MATLAB,指令窗不关闭,这些变量将一直保存在基本工作空间中。基本工作空间随,MATLAB,的启动而产生;只有关闭,MATLAB,时,该基本空间才被删除。,2,、,M,函数文件(,Function),与脚本(命令)文件不同,函数文件(,Function file),犹如一个“黑箱”。从外界只能看到传给它的输入量和送出来的计算结果,而内部运作是藏而不见的。,函数文件的,特点,:,从形式上看,与脚本文件不同,函数文件的第一行总是以“,function”,引导的“函数申明行”(,Function declaration line)。,该行还罗列出函数与外界联系的全部“标称”输入输出宗量。但对“输入输出宗量”的标称数目并没有限制,即可以完全没有输入输出宗量,也可以是任意数目。,MATLAB,允许使用比“标称数目”较少的输入输出宗量,实现对函数的调用。,从运行上看,与脚本文件运行不同,每当函数文件运行,,MATLAB,就会专门为它开辟一个临时工作空间,称之谓,函数工作空间,(,Function workspace)。,所有中间变量都存放在函数工作空间中。当执行完文件最后一条指令或遇到,return,时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量就立即被清除。,函数空间随具体,M,函数文件的被调用而产生,随调用结束而删除。函数空间是,相对独立的,、,临时的,。在,MATLAB,整个运行期间,可以产生任意多个临时函数空间。,假如在函数文件中,发生对某脚本文件的调用,那么该脚本文件运行产生的所有变量都存放于该函数空间之中,而不是存放在基本空间。,3、局部变量和全局变量,局部(,Local),变量,它存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于该函数本身。,全局(,Global),变量,通过,global,指令,,MATLAB,也允许几个不同的函数空间以及基本空间共享一个变量。这种被共享的变量称为全局变量。每个希望共享全局变量的函数或,MATLAB,基本工作空间,必须逐个用,global,对具体变量加以专门定义。没采用,global,定义的函数或基本空间,将无权享用全局变量。,如果某个函数的运作使全局变量的内容发生了变化,那么其他函数空间以及基本工作空间中的同名变量也就随之变化。,除非与全局变量联系的所有工作空间都被删除,否则全局变量依然存在。,例,4,、,M,文件的一般结构,由于从结构上看,脚本文件只是比函数文件少一个“函数申明行”。,典型,M,函数文件的结构:,函数申明(定义)行(,Function declaration line),:,H1,行(,The first help text line),:,在线帮助文本(,Help text),区,:,编写和修改记录,:,函数体(,Function body),:,M,函数文件示例,函数申明(定义)行(,Function declaration line):,位于函数文件的首行,以,MATLAB,关键字,function,开头,函数名以及函数的输入输出宗量都在这一行定义。,H1,行(,The first help text line):,紧随函数申明行之后以%开头的第一注释行。按,MATLAB,自身文件的规则,,H1,行包含:大写体的函数文件名;运用关键词简要描述的函数功能。该,H1,行供,lookfor,关键词查询和,help,在线帮助使用。,在线帮助文本(,Help text),区:,H1,行及其之后的连续以%开头的所有注释行构成整个在线帮助文本。它通常包括:函数输入输出宗量的含义,调用格式说明。,编写和修改记录:,与在线帮助文本区相隔一个空行,也以%开头,标志编写及修改该,M,文件的作者和日期、版本记录。它用于软件档案管理。,函数体(,Function body):,为清晰起见,它与前面的注释行以空行相隔。这部分内容由实现该,M,函数文件功能的,MATLAB,指令组成。它接收输入宗量,进行程序流控制,得到输出宗量。其中为阅读、理解方便,也配置适当的空行和注释。若仅从运算角度看,惟有函数申明行和函数体两部分是构成,M,函数文件所必不可少的。,5、,变量的检测传递和限权使用函数,输入输出宗量检测指令,跨空间变量传递,子函数和私用函数,输入输出宗量检测指令,nargin,在函数体内,用于获取实际输入宗量,nargout,在函数体内,用于获取实际输出宗量,nargin,(fun),获取,fun,指定函数的标称输入宗量数,nargout,(fun),获取,fun,指定函数的标称输出宗量数,inputname,(n),在函数体内使用,给出第,n,个输入宗量的实际调用变量名,跨空间变量传递,跨空间计算串表达式的值,跨空间赋值,跨空间计算串表达式的值,前面已介绍了实现不同工作空间之间变量传递的两种渠道:函数的输入输出宗量和全局变量。下面介绍第三个传递渠道:跨空间计算串表达式值的指令。,evalin,(workspace,expression),跨空间计算串表达式值,说明:,workspace,可取两个值:,base,和,caller,该调用格式的执行机理:,当,workspace,取,base,表示计算,eval,(expression),时,将从基本工作空间获得变量值。,当,workspace,取,caller,表示计算,eval,(expression),时,将从主调函数工作空间获得变量值。主调函数是相对被调函数而言的。这里,被调函数是指,evalin,所在的函数。,evalin,(workspace,expression1,expression2),跨空间计算替代串表达式值,说明:,workspace,可取两个值:,base,和,caller,该调用格式的执行机理:,先从所在函数空间获得变量值用,eval,(expression1),计算原串表达式;若该计算失败,则在从,workspace,指定的(基本或主调函数)工作空间获取变量值,再通过,eval,(expression2),计算替代串表达式,。,例:,evalin,运行机理与,eval,的异同。,跨空间赋值,实现不同工作空间之间变量传递的第四个传递渠道是跨空间赋值指令:,assignin,(workspace,VN,x),跨空间向,VN,变量赋值,说明:把当前工作空间内变量,x,的值赋给,workspace,指定空间名的,VN,变量。,例:,assignin,运作机理示范,子函数和私用(局部)函数,子函数,私用(局部)函数,子函数,MATLAB,允许一个,M,函数文件包含多个函数的代码。其中,第一个出现的函数称为,主函数,(,Primary function),,该文件中的其他函数称为,子函数,(,Subfunction,)。,保存时所用的函数名与主函数定义名相同。外部程序只能对主函数进行调用。,子函数的性质,:,子函数的性质:,每个子函数的第一行是其自己的函数申明行。,在,M,函数文件内,主函数的位置不可改变,但子函数的排列次序可任意改变。,子函数只能被处于同一文件的主函数或其他子函数调用。,在,M,函数文件中,任何指令通过“名字”对函数进行调用时,子函数的优先级仅次于内装函数。,同一文件的主函数、子函数的工作空间都是彼此独立的。各函数间的信息,或通过输入输出宗量传递,或通过全局变量传递,或通过跨空间指令传递。,help,lookfor,等帮助指令都不能提供关于子函数的任何帮助信息。,涉及子函数的算例。,私用(局部)函数,所谓,私用(局部)函数,,是指位于,private,目录上的,M,文件函数。,私用(局部)函数的性质:,私用(局部)函数的构造与普通,M,函数完全相同。,私用(局部)函数的只能被,private,目录的直接父目录上的,M,函数文件所调用。它不能被其他目录上的任何,M,函数、,M,脚本文件或,MATLAB,指令窗中的命令所调用,也不能被直接父目录上的,M,脚本文件调用。,M,文件中,任何指令通过“名字”对函数进行调用时,私用(局部)函数的优先级虽低于内装函数和子函数,但高与其他任何目录上的函数。,help,lookfor,等指令都不能提供关于私用,(局部),函数的任何帮助信息。,二、,MATLAB,的数据类型,6,种基本数据类型及若干衍生类型。,数据类型,Data Types,数值,Numeric,字符串,Char,元胞,Cell,构架,Structure,函数句柄,Function handle,JAVA,类,JAVA Class,双精度,double,单精度,single,整数类,Int,*,uint,*,稀疏,sparse,数据文件,MATLAB,允许接受的数据文件大致可分为以下几类:,以.,mat,为扩展名的二进制数据文件。,以.,txt、.,dat,为扩展名的,ASCII,码数据文件。,以.,bmp、.,jpg,、.,tif,等为扩展名的图像文件。,以.,wav,为扩展名的声音文件。,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,循环是应用逻辑表达式来设置与判断是否执行循环体,循环次数依逻辑判断条件来决定,循环次数是不固定的。,例:,Fibonacci,数组的元素满足,Fibonacci,规则:,a,k+2,=,a,k,+,a,k,+1,(k=1,2,);,且,a,1,=a,2,=1。,现要求该数组中第一个大于10000的元素。,3、,if-else-end,分支结构,if-else-end,指令为程序流提供了一种分支结构,它最常用的使用方式:,单分支,双分支,多分支,if expression,(commands),end,if expression,(commands1),else,(commands2),end,if expression1,(commands1),elseif,expression2,(commands2),else,(,commandsk,),end,常用,常用,该使用方法常被,switch-case,所取代,例,一个简单的分支结构,两个分支结构,多分支结构:,设某批发贸易公司从事苹果批发,当客户购买5000件以上,15元/件;25005000件,16元/件;10002500件,17元/件;5001000件,18元/件;250500件,19元/件;100250件,20元/件;50100件,22元/件;1050件,24元/件;9件以下,28元/件