第3讲 MATLAB程序设计.ppt_第1页
第3讲 MATLAB程序设计.ppt_第2页
第3讲 MATLAB程序设计.ppt_第3页
第3讲 MATLAB程序设计.ppt_第4页
第3讲 MATLAB程序设计.ppt_第5页
已阅读5页,还剩30页未读, 继续免费阅读

下载本文档

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

文档简介

1、第3讲MATLAB程序设计,3.1 脚本文件 3.2 程序控制语句 3.3函数文件 3.4程序调试,3.1 脚本文件 3.1.1 M文件概述 用MATLAB语言编写的程序,称为M文件。M文件分为两类: 1. 脚本文件(Script File) 2. 函数文件(Function File)。,脚本文件的特点 1.是一串按用户意图排列而成的MATLAB指令集; 2. 脚本文件运行后,所产生的变量都驻留在MATLAB工作空间中。故一般脚本文件的正文部分都以clear命令开头,已清空当前的工作空间。,脚本文件的结构 (1)在线帮文本(help text): 以%开头的注释行,它包含对对本文件的功能的简

2、要描述,供lookfor关键字查询和help在线帮助使用。 (2)编写和修改记录: 与在线帮助文本相隔一个空行,以%开头,记录该文件的作者和日期,版本记录。 (3) 文件体,与前面注释部分以空行相隔,为脚本文件的主体内容。,命令文件示例: % Fahrenheit temperature to Celsius temperature % f: Fahrenheit temperature % c: Celsius temperature %c : written by xxx, version: 1.1 clear; %清除工作空间中的变量 f=input(Input Fahrenheit t

3、emperature:); c=5*(f-32)/9,3.1.2 M文件的建立与打开 M文件是一个文本文件,它可以用任何编辑程序来建立和编辑,而一般常用且最为方便的是使用MATLAB提供的文本编辑器。 1启动MATLAB文本编辑器有3种方法: (1) 菜单操作。 从MATLAB主窗口的File菜单中选择New菜单项,再选择M-file命令。 (2) 命令操作。 在MATLAB命令窗口输入命令edit, (3) 命令按钮操作。 单击MATLAB主窗口工具栏上的New M-File命令按钮。,2打开已有的M文件 打开已有的M文件,也有3种方法: (1) 菜单操作。 从MATLAB主窗口的File菜

4、单中选择Open命令,则屏幕出现Open对话框,在Open对话框中选中所需打开的M文件。 (2) 命令操作。 在MATLAB命令窗口输入命令:edit 文件名 (3) 命令按钮操作。 单击MATLAB主窗口工具栏上的Open File命令按钮。,3.2 程序控制语句,3.2.1 for 循环结构 for x=array 循环体; end 说明:x是循环变量,for 语句和end之间是循环体,循环次数由数组array的列数指定。 注:1.循环不会因为在循环体内对循环变量的改变而结束 2.为使代码高效,应尽量提高代码的向量化程度,避免使用循环结构,例3.2.1:for n=10:-1:1 n=10

5、0 end 例3.2.2: for n=2,1.1,3.2,5 n n=10 end 例3.2.3 for n=magic(3) n end,例3.2.4 比较下列两个程序结果,2. a=magic(1000); t=cputime ; s=sum(sum(a); t=cputime-t,1. a=magic(1000); s=0; t=cputime; for n=1:1000 for m=1:1000 s=s+a(n,m); end end t=cputime-t,3.2.2 while 循环结构 格式: while表达式 循环体; end 说明:若表达式的值为逻辑真(非零),则执行循环

6、体,直到表达式的值为假,就结束循环。 注: 1.一般情况下,表达式的值都是标量值,但是 MATLAB允许它为一个数组,此时只有当该数组元素均为真时,MATLAB才会执行循环体 2.如while指令后的表达式为空数组,MATLAB认为表达式的值为假,而不执行循环体。,3.2.2 if-else-end 分支结构,if 表达式 命令组1; end,if 表达式1 命令组1; else 命令组2; end,if 表达式1 命令组1; elseif 表达式2 命令组2; elseif 表达式3 命令组3; end,注:同样的,这里的表达式的值可以是矩阵,只有当该数组元素均为真时,才执行对应的命令组,3

7、.2.3 switch-case 结构 switch ex case test1 命令组1; case test2 命令组2; otherwise 命令组3; end,注:case 后面的值可以是标量,字符串,单元数组。为单元数组时,MATLAB把ex的值和单元数组的每一个元素做比较,只要有一个元素匹配就执行对应的命令组。,例: switch a case d disp(case 1) case a,b disp(case 2); case a,c disp(case 3) end,3.2.4 try-catch 结构 try 命令组1; catch 命令组2;end,注: 1.命令组1总被执

8、行,执行时若有错,才执行命令组2 2.可调用lasterr函数查询出错原因,如果函数lasterr的运行结果是一个空字符串,表明命令组1执行正确 3. 当执行命令组2时又出错,MATLAB将终止该结构。,例:clear; N=4;A=magic(3); try A_N=A(N,:); catch A_end=A(end,:); end lasterr,3.2.5 控制程序流的其他常用指令 1. return 结束当前函数,并将程序流程转出 2.pause 暂停程序,并等待用户按任意键继续 pause n 暂停 n 秒 3. keybroad 暂停程序,将控制权交给键盘,用户可以从键盘输入若干命

9、令,只有当用户使用return命令,“控制权”才交给程序 4. break和continue break 跳出本层循环,继续循环结构后的语句 continue 跳出本次循环,继续下次循环 5.error 和 warning error(message),显示 message,终止程序 warning(message),显示message,继续程序,3.3 函数文件,函数文件的特点 (1)函数文件的第1行总是以“function”引导的函数声明行,该行罗列出输入形参和输出变量,输入形参和输出变量数量无限制,也可以都没有,其它部分的机构与命令文件相同 (2) 函数文件运行时,所有产生的变量都存放到

10、一个临时的工作空间中,该函数文件结束运行时,该临时工作空间被清除,这个临时工作空间成为该函数的工作空间。 (3) 一般情况下,函数文件名和该文件中的主函数同名,若不一致,MATLAB将以函数文件名为准。,函数文件示例: function s,p=fcircle(r) %fcircle calculate the area and perimeter of a circle of radii r %r radii %s area %p perimeter %2008-8-8 s=pi*r*r; p=2*pi*r;,函数文件的调用 格式是: 输出实参表=函数名(输入实参表),例3.3.1利用函数文

11、件,实现直角坐标(x,y)与极坐标(,)之间的转换。 函数文件tran.m: function rho,theta=tran(x,y) rho=sqrt(x*x+y*y); theta=atan(y/x); 调用tran.m的命令文件main1.m: clear x=input(Please input x=:); y=input(Please input y=:); rho,theta=tran(x,y); rho theta 在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数,甚至调用它自身。一个函数调用它自身称为函数的递归调用。,例:3.3.2 利用函数的递归调用,求n!。

12、递归调用函数文件factor.m如下: function f=factor(n) if n=1 f=1; else f=factor(n-1)*n; %递归调用求(n-1)! end,输入输出参数个数的可调性 在调用函数时,可用函数nargin和nargout获取调用该函数时的输入实参和输出实参的个数。 只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。,例3.3.3 nargin用法示例。 函数文件 charray.m: function fout=charray(a,b,c) if nargin=1 fout=a; elseif

13、 nargin=2 fout=a+b; elseif nargin=3 fout=(a*b*c)/2; end,命令文件:mydemo.m: x=1:3; y=1;2;3; charray(x) charray(x,y) charray(x,y,3),局部变量和全局变量 (1) 局部变量产生于相应函数的运行过程中,存在于相应函数执行时的工作空间中,其影响范围也仅限于该函数本身 (2)全局变量是在所有的工作空间中都可以访问的变量,并且必须在使用前用globel定义,例3.3.4 全局变量应用示例。 先建立函数文件wadd.m,该函数将输入的参数加权相加。 function f=wadd(x,y)

14、 global ALPHA BETA f=ALPHA*x+BETA*y; 在命令窗口中输入: global ALPHA BETA ALPHA=1; BETA=2; s=wadd(1,2),MATLAB 中的按值传递机制 例:sample.m的内容: function out = sample(a, b) fprintf(In Sample: a = %f, b = %f %fn,a,b); a = b(1) + 2*a; b = a .* b; out = a + b(1); fprintf(In Sample: a = %f, b = %f %f n,a,b); 下面是调用这个函数的命令文件

15、:test_sample.m a = 2; b = 6 4; fprintf(Before sample: a = %f, b = %f %fn, a, b); out = sample(a, b); fprintf(After sample: a = %f, b = %f %fn,a,b); fprintf(After sample: out = %f n, out); 当这个程序被执行将产生如下的结果: test_sample Before sample: a = 2.000000, b = 6.000000 4.000000 In Sample: a = 2.000000, b = 6.

16、000000 4.000000 In Sample: a = 10.000000, b = 60.000000 40.000000 After sample: a = 2.000000, b = 6.000000 4.000000 After sample: out = 70.000000,当一个函数调用发生时, MATLAB先对函数的每一个局部变量进行分析,确定函数的哪些局部变量进行了修改。,如果函数修改了这个局部变量的值,将会复制 对应实参生成一个副本,然后把它们传递给函数。 如果函数没有修改这个局部变量的值,它将不会对此参数进行复制,而是简单地指向程序外面的外面的变量.,全局变量占用的是

17、全局内存,传递时不做复制,故全局变量尤其适用于在许多函数分享大容量数据。,内联函数 格式:g = inline(expr,arg1,arg2,.) 例:f=inline(x2,x) f(0.4),主函数与子函数 MARTLAB允许一个函数文件包含多个函数代码,其中,第一个出现的函数称为主函数(Primary function),该文件中的其它函数称为子函数(Subfunction) 保存时文件名与主函数同名,子函数的规则 1. 每个子函数的第一行是其自己的函数声明行 2.在函数文件内,主函数的位置不可改变,但子函数的排列顺序可以任意改变 3.子函数只能被处于同一文件的主函数或其它子函数调用 4

18、.同一文件的主函数,子函数的工作空间是彼此独立的,各函数之间或通过输入输出变量传递,或通过全局变量传递,或通过跨空间指令传递。 5.help,lookfor等帮助命令不能提供关于子函数的任何信息,跨空间变量传递 1. 跨空间计算表达式的值 evalin(workspace,expression) workspace可取两个值:base和caller 当workspace取base时,表示从基本工作空间中获得相应变量,计算表达式expression的值 当workspace取caller时,表示从主调函数的工作空间中获得变量值,主调函数是相对于被调函数而言,被调函数是指evalin所在函数,2. 跨空间赋值 assignin(workspace,VN,x) 把当前工作空间内变量x的值赋给workspace制定空间中名为VN的变量 workspce的值为base或caller,例:跨空间计算和子函数应用,文件 evalin_test.m的内容: function y1=evalin_test(a,s) t=(0:a)/a*2*pi; y1=subevalin_test(4,s

温馨提示

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

评论

0/150

提交评论