- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.打开已有的M文件 打开已有的M文件,也有3种方法: (1) 菜单操作。 从MATLAB主窗口的File菜单中选择Open命 令,则屏幕出现Open对话框,在Open对话框 中选中所需打开的M文件。 (2) 命令操作。 在MATLAB命令窗口输入命令:edit 文件名 (3) 命令按钮操作。 单击MATLAB主窗口工具栏上的Open File命 令按钮。
3.2.3 switch-case 结构 switch ex case test1 命令组1; case test2 命令组2; otherwise 命令组3; end
注:case 后面的值可以是 标量,字符串,单元数组。 为单元数组时,MATLAB 把ex的值和单元数组的每 一个元素做比较,只要有 一个元素匹配就执行对应 的命令组。
例:3.3.2 利用函数的递归调用,求n!。 递归调用函数文件factor.m如下: function f=factor(n) if n<=1 f=1; else f=factor(n-1)*n; %递归调用求(n-1)! end
输入输出参数个数的可调性
在调用函数时,可用函数nargin和 nargout获取调用该函数时的输入实参 和输出实参的个数。 只要在函数文件中包含这两个变量,就 可以准确地知道该函数文件被调用时 的输入输出参数个数,从而决定函数 如何进行处理。
3.3 函数文件
函数文件的特点 (1)函数文件的第1行总是以“function”引导的函数声明行, 该行罗列出输入形参和输出变量,输入形参和输出变量数 量无限制,也可以都没有,其它部分的机构与命令文件相 同 (2) 函数文件运行时,所有产生的变量都存放到一个临时的 工作空间中,该函数文件结束运行时,该临时工作空间被 清除,这个临时工作空间成为该函数的工作空间。 (3) 一般情况下,函数文件名和该文件中的主函数同名,若 不一致,MATLAB将以函数文件名为准。
例3.3.3 nargin用法示例。 函数文件 charray.m: function fout=charray(a,b,c) if nargin==1 fout=a; elseif 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)
3.2 程序控制语句
3.2.1 for 循环结构 for x=array 循环体; end 说明:x是循环变量,for 语句和end之间是循环体,循环次 数由数组array的列数指定。 注: 1.循环不会因为在循环体内对循环变量的改变而结束 2.为使代码高效,应尽量提高代码的向量化程度,避免使 用循环结构
局部变量和全局变量 (1) 局部变量产生于相应函数的运行过程中, 存在于相应函数执行时的工作空间中,其 影响范围也仅限于该函数本身 (2)全局变量是在所有的工作空间中都可以访 问的变量,并且必须在使用前用globel定义
例3.3.4 全局变量应用示例。 先建立函数文件wadd.m,该函数将输入的参数加权相加。 function f=wadd(x,y) global ALPHA BETA f=ALPHA*x+BETA*y; 在命令窗口中输入: global ALPHA BETA ALPHA=1; BETA=2; s=wadd(1,2)
例3.2.1:for n=10:-1:1 n=100 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 比较下列两个程序结果
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.3.1利用函数文件,实现直角坐标(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中,函数可以嵌套调用,即一个函数可以调用别的函数, 甚至调用它自身。一个函数调用它自身称为函数的递归调用。
例: 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总被执行,执行 时若有错,才执行命令组2
当一个函数调用发生时, 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;
2. a=magic(1000); t=cputime ; s=sum(sum(a)); t=cputime-t
3.2.2 while 循环结构 格式: while表达式 循环体; end 说明:若表达式的值为逻辑真(非零),则执行循环 体,直到 表达式的值为假,就结束循环。 注: 1.一般情况下,表达式的值都是标量值,但是 MATLAB允许 它为一个数组,此时只有当该数组元素均为真时, MATLAB才会执行循环体 2.如while指令后的表达式为空数组,MATLAB认为表达式的 值为假,而不执行循环体。
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.1.2 M文件的建立与打开
M文件是一个文本文件,它可以用任何编辑程序 来建立和编辑,而一般常用且最为方便的是使用 MATLAB提供的文本编辑器。 1.启动MATLAB文本编辑器有3种方法: (1) 菜单操作。 从MATLAB主窗口的File菜单中选择New菜单项, 再选择M-file命令。 (2) 命令操作。 在MATLAB命令窗口输入命令edit, (3) 命令按钮操作。 单击MATLAB主窗口工具栏上的New M-File命令 按钮。
第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): 以%开头的注释行, 它包含对对本文件的功能的简要描述,供 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 temperature:'); c=5*(f-32)/9
全局变量占用的是全局内存,传递时不做
复制,故全局变量尤其适用于在许多函数 分享大容量数据。
内联函数 格式:g = inline(‘expr’,’arg1’,’arg2’,...) 例:f=inline(‘x^2’,’x’) f(0.4)
MATLAB 中的按值传递机制
例:sample.m的内容: function out = sample(a, b) fprintf('In Sample: a = %f, b = %f %f\n',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); 下面是调用这个函数的命令文件:test_sample.m a = 2; b = [6 4]; fprintf('Before sample: a = %f, b = %f %f\n', a, b); out = sample(a, b); fprintf('After sample: a = %f, b = %f %f\n',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.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