matlabppt第五讲.ppt_第1页
matlabppt第五讲.ppt_第2页
matlabppt第五讲.ppt_第3页
matlabppt第五讲.ppt_第4页
matlabppt第五讲.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五讲,Matlab提供的工作方式包括:,1 交互式指令操作:用户在命令窗口输入命令,系统执行现实结果,适合于简单的问题的处理 2 M文件的编程工作:调用函数文件执行程序,M文件是由Matlab语句构成的ASCII码文本文件,扩展名为.m。 M文件有两种形式:M脚本文件和M函数文件。,一 M文件,1 M文件的创建和执行 2 M脚本文件和函数文件 3 M文件的结构,1) M文件创建,保存,打开和编辑。(见演示),2) 搜索和执行M文件:,执行方法:用户在命令窗口键入M文件名,并按下回车键来执行。系统首先搜索该文件,若文件存在,以解释方式按顺序执行M文件的语句。 搜索过程: 检查工作空间是否有该名称 检查是否为MATLAB内部函数 检查当前目录 在默认搜索路径中查找文件,1 M文件的创建和执行,2 脚本文件和函数文件,1) M脚本文件,是一串按用户意图排列而成的(包括控制流指令) matlab指令集合。 脚本文件中的命令格式和前后位置,与在命令窗口中输入的没有任何区别。,脚本文件的特点:,1) MATLAB在运行脚本文件时,只是简单地按顺序从文件中读取一条条命令,送到MATLAB命令窗口中去执行。 2) 与在命令窗口中直接运行命令一样,脚本文件运行产生的变量都是驻留在MATLAB的工作空间(workspace) 中,可以很方便地查看变量,除非用clear命令清除;脚本文件的命令也可以访问工作空间的所有数据,因此要注意避免变量的覆盖而造成程序出错。 3)脚本文件创建或定义的变量保留在工作空间中,因此空间中的其他命令文件和函数文件都可以访问这些变量。 4) 因此在程序设计中,脚本文件常作为主程序来设计。,2) M函数文件,与脚本文件不同,函数文件是一个黑箱,从外界只能看到传给它的输入量和送出来的计算结果,内部运行是不可见的它的特点是:,(1) 从形式上看,与脚本文件不同,函数文件的第一行总是以”function”引导的函数申明行,该行还罗列出函数与外界联系的全部标称输入输出宗量对输入输出宗量的数目没有限制即可以没有输入输出宗量,也可以是任意多个数目,function 输出变量列表 = 函数名(输入变量列表),函数声明格式:,(2) matlab允许使用比标称数目少的输入输出宗 量,实现对函数的调用.,(3)函数文件保存的文件名应该和用户定义的函数 名一致。,(4) 从运行上看,与脚本文件不同.函数文件运行时, matlab会专门为它开辟一个临时工作空间,称为函数工作空间.所有中间变量都存放在函数工作空间.当执行完文件最后一条指令或遇到return时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量就立即被清除,(6) 假如在函数文件中,发生对某脚本文件的调用,那么该脚本文件运行产生的所有变量都存放在该函数空间中,而不是在基本空间,(5) 函数空间随具体M函数文件的调用而产生,随调用结束而删除.函数空间是相对基本空间独立的,临时的.在matlab整个运行期间,可以产生任意多个临时函数空间,3 M文件的一般结构,(1) 函数申明行:位于函数文件的首行,以matlab关键字function开头,函数名以及函数的输入输出宗量都在这一行定义,(2) H1行:紧随函数申明行之后以%开头的第一注释行包括:大写体的函数文件名,运用关键词简要描述函数功能该行供lookfor关键词查询和help在线帮助使用,(3) 在线帮助文本区:H1行及其之后的连续以%开头的所有注释行构成的整个在线帮助文本.通常包括:函数输入输出宗量的含义,调用格式说明.,(4) 编写和修改记录:以%开头,注释编写和修改的日期,版本记录,(5) 函数体:是实现M文件功能的指令集它接收输入宗量,进行程序流程控制,得到输出宗量如果仅从运算角度看,只有函数申明行和函数体两部分是构成M函数文件必不可少的,说明: 从结构上看,M脚本文件仅比M函数文件少一个函数申明行,其余各部分的构造和作用都相同 函数定义名和保存文件名一致两者不一致时,将忽视文件首行的函数定义名,而以保存文件名为准 函数文件的名字必须以字母开头,后面可以是字母,下划线以及数字的任意组合,例 M函数文件示例,% circle.m function sa=circle(r,s) % 函数申明行 % CIRCL plot a cirlce of radiar in the line specified by s % r 指定半径数值 % s 指定线型颜色的字符串 % sa 圆面积 % % circle(r) 利用蓝实线画半径为r的圆 % circle(r,s) 利用s指定的颜色画半径为r的圆 % sa=circle(r) 计算圆面积,并画半径为r的兰色圆周 % sa=circle(r,s) 计算圆面积,并画半径为r的圆,s指定线的颜色 % 编写于x年x月x日,修改于x年x月x日,if nargin2 error(输入宗量太多); end; if nargin=1 s=b; end; clf; t=0:pi/100:2*pi; x=r*exp(i*t); if nargout=0 plot(x,s); else sa=pi*r*r; fill(real(x),imag(x),s) end axis(square),二 Matlab程序控制流,for循环结构 while循环结构 if-else-end分支结构 switch-case结构 try-catch结构 控制程序流的其他常用指令,matlab提供了五种控制程序流的结构:,(1) for循环结构,for k=k1:inc:k2 (和一维数组冒号法定义相同) (command) % 循环体 end,例 for循环示例,for ii=1:10 x(ii)=ii; end,x = 1 2 3 4 5 6 7 8 9 10,说明: 循环不会因为在循环体内对循环变量更新设置而中 断 在for后面的表达式中的数组可以为任何合法的matlab数组 循环结构可以嵌套使用 为了得到高效率的代码,应尽量提高代码的向量化程度,避免使用循环结构;在循环指令之前应尽量对数组进行预定义 由于i和j是预定义变量,作虚单位使用建议不作为循环变量使用,例 多重循环生成9x9乘法表,for ii=1:9 for kk=1:ii a(ii,kk)=ii*kk; end end,x=1:1:9; y=x; x=x*y; a=ones(9,9); a=tril(a); table=x.*a,矩阵的运算得到,(2) while循环结构,while expression (command) % 循环体 end,说明: 在while和end之间的组命令为循环体. 当执行到while指令时, 首先检测expression的值,如其值为逻辑真(非0),则执行循环体中的命令(组命令).当组命令执行完毕,继续检测表达式的值,若仍为真,循环执行组命令,一旦表达式为假,就结束循环 while和for两种循环的区别在于:while循环结构的循环体被执行的次数是不确定的,而for结构中循环体的执行次数是确定的 当while指令后的表达式是空数组时,认为表达式值为假 使用while循环条件时要小心出现无限循环,如果出现按Ctrl+C可终止,例 级数收敛性判断:,当收敛到终值 s=2/6,的0.01%以内时,项数N是多少.,series=1; k=2; exact=pi2/6; while abs(series-exact)/exact)1e-4; series=series+1/k2; k=k+1; End,(3) if-else-end分支结构,if-else-end指令为程序流提供了一种分支结构,它的最常用的方式为:, 如果判决条件expression为一个空数组,认为条件为假 表达式由多个逻辑子表达式组成时,将尽可能少地检测子表达式的值 if指令判决和break指令配合使用,可以强制终止for或while循环,(4) switch-case结构,switch expression case test1 command1 case test2 case testk commandk otherwise commands end,说明: 当遇到switch结构时,matlab将表达式的值依次和各个case指令后面的检测值进行比较。如果比较结果为假,则取下一个检测值再比较,一旦比较结果为真,matlab将执行相应的一组命令,然后跳出该结构。如果所有的比较结果都为假,即表达式和所有的检测值都不等,matlab将执行otherwise后面的一组命令。可见该结构保证至少有一组命令会得到执行。 switch指令后面的表达式为一个标量或者一个字符串。对于标量形式的表达式,比较这样进行:表达式检测值i.对于字符串,将调用函数strcmp来实现比较。 case指令后面的检测值不仅可以是一个标量值或字符串,还可以是一个单元数组。如果一个检测值是一个单元数组,matlab将把表达式的值和该单元数组中的所有元素进行比较,如果单元数组中某个元素和表达式的值相等,就认为此次比较结果为真。 当matlab检测到某个检测值和表达式相等时,将执行相应的一组命令,执行完毕,自动跳出swith结构,无需使用break指令。,for month = 1:12 switch month case 3,4,5 season = Spring; case 6,7,8 season = Summer; case 9,10,11 season = Autumn; case 12,1,2 season = Winter; end fprintf(Month %d = %s.n, month, season); end,例:根据月份来判断季节,(5) try-catch结构,try command1 % 组命令1总被执行,若正确,则跳出此结构 catch command2 % 仅当组命令1出现执行错误,组命令2才被执行 end,说明: 只有在执行组命令1出现错误后,组命令2才被执行 可调用lasterr函数查询出错原因,如果函数lasterr运行结构为一个空 串,则表明命令1被成功执行了。 当执行组命令2时出错,则终止该结构,例 try-catch结构应用,N=4; A=magic(3); % A为3x3矩阵 try A_N=A(N, : ); % 取A的第N行元素 catch A_end=A(end, : ); end lasterr,(6) 控制程序流的其他常用指令,1) v=input(msg) v=input(msg, s ) 该指令执行时,控制权交给键盘,待输入结束,按Enter键,控制权交换matlab ,msg是提示用的字符串,告诉用户输入什么.第一种格式用于键入数值,字符 串等数据,最后v是一个数值(包括数组)或者一个字符串第二种格式,不管 键入什么,总以字符串形式赋给变量v,2) keyboard 从M文件中激活键盘,遇到该命令时,将控制权交给键盘,用户可以从键盘输入各种matlab指令,仅当用户输入return指令后,控制权才交还给程序与input指令的区别是:该指令允许输入任意多个matlab指令,而input只能输入赋给变量的值该指令在调试M文件时非常有用,3) continue 跳过位于其后的循环中的其他指令,执行循环的下一个迭代,例 更改数组中的值,a=ones(1,12); for k=1:12 if rem(k,3)=0 continue else a(k)=k; end end,4) Break 终止while,for循环,也可以在if-end, switch-case, try-catch中导致中断,5) pause, pause(n) 第一种格式使程序暂停执行,等待用户按任意键继续,第二种格式使程序暂停n秒后,再继续执行,8) lasterr, 显示最新出错原因,并终止程序,9) lastwarn 显示matlab自动给出的最新警告程序并继续运行,6) return 结束return指令所在函数的执行,把控制转至主调函数或指令窗.否则,只有 整个被调函数执行完毕才转出,7) error(msg) 显示出错信息msg,终止程序,10) warning(msg) 显示警告信息msg,程序继续执行,三 变量的检测传递和限权使用函数,1 输入输出宗量检测指令 2 局部变量和全局变量 3 子函数和私用函数,1 输入输出宗量检测指令,nargin-在函数体内,用于获取实际输入宗量 nargout-在函数体内,用于获取实际输出宗量 nargin(fun)-获取fun指定函数的标称输入宗量 nargout(fun)-获取fun指定函数的标称输出宗量 inputname(n)-在函数体内使用,给出第n个输入宗量的实际调用变量名 Varargin-输入参数 Varargout-输出参数,例:参见教学示例circle,2 局部变量和全局变量,(1) 局部变量 它存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围 也仅限于该函数本身,(2) 全局变量 通过global指令,matlab也允许几个不同的函数空间以及基本工作空间共享同一个变量.这种共享的变量称为全局变量.每个希望共享全局变量的函数或matlab基本工作空间,必须逐个用global对具体变量加以专门定义.没采用global定义的函数或基本工作空间,将无权享用全局变量,对全局变量的定义必须在该变量被使用之前进行,建议把全局变量的定义放在函数体的首行位置,并使用大写字符命名全局变量由于全局变量损害函数的封装性,因此不提倡使用全局变量,3 子函数和私用函数,(1) 子函数,matlab允许一个M函数文件包含多个函数的代码,其中,第一个出现的函数称为主函数该文件中的其他函数称为子函数保存时所用函数文件名与主函数定义名相同外部程序只能对主函数进行调用,子函数性质:,1) 每个子函数的第一行是其函数申明行 2) 在M函数文件内,主函数的位置是不可改变的,但子函数的排列次序可以任意变动 3) 子函数只能被处于同一文件的主函数或其他子函数调用 4) 在M函数文件中,任何指令通过函数名对函数进行调用时,子函数的优先级仅次于内建函数 5) 同一文件的主函数,子函数的工作空间都是彼此独立的,各函数间的信息,或通过输入输出宗量,或通过全局变量传递,或通过跨空间指令传递,(2) 私用函数,所谓私用函数,是指位于private目录上的M文件函数其性质如下:,1) 私用函数的构造与普通M函数完全相同 2) 私用函数只能被private目录的直接父目录上的M文件函数所调用,它不能被其他目录上的任何M函数, M脚本文件或matlab指令窗中的命令所调用也不能被直接父目录上的M脚本文件调用 3) M文件中,任何指令通过函数名对函数进行调用时,私用函数的优先级虽低于内建函数和子函数,但高于其他任何目录上的函数,matlab的搜索顺序总结,假设matlab在一个文件中碰到指令cow时,它将按以下步骤逐步进行检索,(1) 检查cow是否一个变量名,如果不是,执行下一步; (2) 检查cow是不是内建函数(Built-in Function),不是则执行下一步 (3) 检查cow是不是cow所在的M文件中的一个子函数,不是则往下执行 (4) 检查cow是不是它所在M文件的一个私有函数(先找cow.p,然后是 cow.m),不是则往下执行 (5) 检查cow是不是当前目录下的文件(先找cow.p,然后是cow.m),不是 则往下执行 (6) 检查搜索路径上是否有cow存在(先找cow.p,然后是cow.m) matlab将使用最先找到的那个cow,如果一直找不到,就给出错误提示,四 P码文件,(1) 语法分析过程和伪代码,一个M文件首次被调用(运行文件名或被M文件编辑器打开)时,matlab将首先对该M文件进行语法分析(Parse),并把生成的相应内部伪代码(简称P码)文件存放在内存中此后,再次调用该M文件时,就直接调用该文件在内存中的P码文件,而不会对原码文件重复进行语法分析matlab的分析器总是把M文件连同被它调用的所有函数M文件一起变换成P码文件的,P码文件有与原码文件相同的文件名,其扩展名为.p, P码文件运行速度高于其原码文件.假如存在同名的P码和原码文件,那么当该文件名被调用时,被执行的肯定是P码文件,说明: P码文件较之原码文件有两大优点:一是运行速度快,二是它是二进制文件,程序保密性好,(3) 内存中P码文件的列表和清除,inmem-罗列出内存中所有P码文件名 clear funname-清除内存中的funname.p P码文件 clear functions-清除内存中的所有P码文件,如:pcode circle/circle.p,pcode funname-在当前目录上生成funname.p pcode funname inplace-在funname.m所在目录上生成P码文件 funname.p,(2) P码文件的预生成,五 内联函数,内联函数是matlab提供另一种是实现函数功能的对象。创建内联函数可以使用inline命令实现。,inline(string,arg1,arg2,) %创建内联函数,语法:,string必须是不带赋值号(“=”)的字符串;arg1和arg2是函数的输入变量。,说明:,例:,f=inline(sin(x)*exp(-z*x),x,z) %创建内联函数 y=f(5,0.3) %调用函数f,六 串演算函数,matlab还提供了两种演算函数:一是串演算函数eval,它具有对字符串表达式进行计算的能力;另一种是函数句柄演算函数feval,它具有对函数句柄进行操

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论