MatLab讲义 2002年9月版
例:c={?aaa?,?bbb?,?ccc?} for i=c i end
i=?aaa? i=?bbb? i=?ccc?
例:在循环中,可以改变循环变量的值,但它不会改变循环的次数.
r=1
for k=1:19
k=k+1; r=r*k;
end
例:可利用数组(阵列)任意指定循环变是的值.(ex25.m)
varx=[7 3 10 5]; vary=zeros(size(v)); k=0;
for x=varx
k=k+1
vary(k)=x.^2; end
disp([v,w])
例:(ex31.m)求100-200之间的素数。 for m=101:2:200 k=fix(sqrt(m)); for i=2:k+1
if rem(m,i)==0 break; end end
if i>=k+1 disp(m) end end
4.5 while-end循环
不定次数重复的循环执行语句。 格式:while <逻辑表达式> 循环体 end
例:求1000以下的菲波纳契数(ex26.m)
f=[1 1]; i=1;
while f(i)+f(i+1) < 1000
f(i+2) = f(i) + f(i+1); i=i+1; end
例:a=150;
while a>0.1 a=a/2; end
26
MatLab讲义 2002年9月版
4.6 switch-end语句:
情况切换语句,case语句中可以采用多个值。 语句格式:
switch (变量或表达式) case v1 语句 case v2 语句 ....... otherwise 语句 end
例: switch (rem(n,4)==0) + (rem(n,2)==0)
case 0 ...... case 1 ...... case 2 ...... otherwise
error('This is impossible') end
例:switch var2
case {-2,-1}
disp(?var2 is negative one or two?) case {1,2,3} ...... otherwise
disp(?var2 is other value?) end
4.7 break语句:
一个跳出循环的命令,导致最内层的while,for,if语句终止。 例:(test3.m)
a = 0; fa = -inf; b = 3; fb = inf; while b-a > eps*b x = (a+b)/2; fx = x^3-2*x-5; if fx == 0 break
elseif sign(fx) == sign(fa) a = x; fa = fx; else
b = x; fb = fx; end end x
27
MatLab讲义 2002年9月版
4.8 try..catch语句
用于捕获程序运行中出现的错误,语法如下: try 语句,...语句,catch 语句,...语句 end 在正常情况下,程序只执行try和catch之间的语句,在执行上述语句发生错误时,程序将执行catch和end之间的语句,在这里可以利用lasterr获得错误信息进行处理,如再发生错误,除非嵌套了另一个try...catch,否则程序将中断执行。
4.9 return语句
return语句终止当前的命令序列,把控制返回到调用函数或键盘。
4.10 输入/输出语句
? 获得用户输入input:显示一段信息,并读取用户输入。 语法:x=input(提示信息,\输入类型\,缺省为double型。 例:a=input(?Please input a member?) a=input(?Please input a char?,?s?)
? 暂停执行,等待用户按键pause:程序暂停执行。 语法:pause(n) pause
其中:n为暂停的秒数。
? 建立完整的图形界面:菜单输入函数menu。 例:(ex27.m)
s=menu('color selection','red','greed','blue','yellow','black') switch(s) case 1
scolor='red'; case 2
scolor='green'; case 3
scolor='blue'; case 4
scolor='yellow'; case 5
scolor='blue'; otherwise
disp('error'); end scolor
运行结果:
28
MatLab讲义 2002年9月版
? 输出函数print,printopt
4.11 自定义函数:
用M函数自定义函数,函数M文件必须以函数的名称来作为文件名,M文件的格式如下:
<因变量>=<函数名>(<自变量>)
自变量和因变量都可以是矩阵或几个矩阵。
M文件的第一行包括function,该文件就是函数文件,函数和命令文件的区别是:命令文件的变量用完后保存在内存,而函数文件文件内定义的量仅在函数文件内部起作用。函数文件有多个输出变量时,用[]括起,有多个输出变量时,用()括起。
例:(quroot.m)
function x=quroot(a) if abs(a(1)) > eps
d=a(2)^2-4*a(1)*a(3); if d >= 0 e=sqrt(d); f=2*a(1);
x(1)=(-a(2)+e)/f; x(2)=(-a(2)-e)/f; end
elseif abs(a(2)) > eps x=-a(3)/a(2); else
error('coefficient error!') end
函数调用为: a=[1 2 1] x=quroot(a) x=
-1 -1
/*子函数调用*/
function [mean, stdev] = stat(x) n=length(x); mean = avg(x,n);
stdev = sqrt(sum((x-avg(x,n)).^2)/n);
function mean = avg(x,n)
29
MatLab讲义 2002年9月版
mean = sum(x)/n;
在函数文件中可以包含多个函数,其中第一个函数称为主函数,其函数名与文件名相同,它可以由其它文件引用,其它函数称为子函数,它只能由函数中的主函数和其它子函数引用。
函数中有两个永久变量nargin,nargout 表示引用函数时给出的输入变量数和输出变量数。
function c=testrg1(a,b) if(nargin==1) c=a.^2;
else (nargin==2) c=a*b; end
输入一个变量时,计算这一变量的平方数 输入二个变量时,计算这两个变量的积。
函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身。 例:求n!(ex33.m)
function y=ex33(n) %%求n! if n<0
error('n is smaller them 0') return end
if n==0|n==1 y=1 else
y=n*ex33(n-1); end
4.12 全局变量
局部变量和全局变量:
函数工作空间中,变量有三类:
(1)由调用函数传递输入和输出数据的变量; (2)在函数内部临时产生的变量(局部变量);
(3)由调用函数空间,基本工作空间或其它函数工作空间提供的全局变量。 global:让不同的函数访问同一个变量
只要在函数中:global 变量名;%% 该变量为全局变量
function h = falling(t) global GRAVITY
h = 1/2*GRAVITY*t.^2;
22
例:(ex28.m)对于函数 z=α(x-1)+β(y+1)。编写相应的函数文件,其中α和β采用全局变量进行参数传递。
global alpha beta x=[0:0.02:2]; y=[-2:0.02:0];
[X,Y]=meshgrid(x,y);
subplot(2,2,1);alpha=1;beta=1; z=fun1(X,Y);mesh(z);
subplot(2,2,2);alpha=2;beta=1; z=fun1(X,Y);mesh(z)
subplot(2,2,3);alpha=1;beta=2;
30