§1-3 MATLAB编程
1-3-1例子
例1-54通过M脚本文件,画出下列分段函数所表示的曲面。
0.5457e0.75x23.75x11.5x1x1x21x226x12p(x1,x2)0.7575e1x1x21
0.75x223.75x121.5x10.5457ex1x21(1) 编写M脚本文件的步骤
点击MATLAB指令窗工具条上的New File图标
,就可打开如图8.1-1-1所示
22的MATLAB文件编辑调试器MATLAB Editor/Debugger。其窗口名为untitled ,
用户即可在空白窗口中编写程序。
图 MATLAB Editor/Debugger 窗口
比如输入如下一段程序 [zx81.m]
a=2;b=2; clf;
x=-a:0.2:a;y=-b:0.2:b; for i=1:length(y) for j=1:length(x) if x(j)+y(i)>1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j)); elseif x(j)+y(i)<=-1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j)); else z(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2); end end
end
axis([-a,a,-b,b,min(min(z)),max(max(z))]); colormap(flipud(winter));surf(x,y,z); 点击编辑调试器工具条图标
,在弹出的Windows标准风格的“保存为”
对话框中,选择保存文件夹,键入新编文件名(如zx81),点动【保存】键,就完成了文件保存。
(2)运行文件
使zx81.m所在目录成为当前目录,或让该目录处在MATLAB的搜索路径上 然后运行以下指令,便可得到图形。 zx81
图 运行zx81.m得到的图形
例1-55通过M函数文件画出上例分段函数的曲面。
整个编程步骤和相同。在此演示,如何在zx81.m基础上产生函数文件zx82.m 。
在编辑调试器中,选择【File:Save As】子菜单,把zx81.m文件“另存为”
zx82.m 。
用下面指令代替原文件的第<1>条指令。
function zx82(a , b)
% a Define the limit of variable x . % b Define the limit of variable y .
进行上述修改后,对zx82.m再次实施“保存”操作。
在MATLAB指令窗中,运行以下指令,就能产生与图8.1-1-2完全相同的图
形。
zx82(2,2)
1-3-2关系和逻辑运算
除了传统的数学运算,MATLAB支持关系和逻辑运算。如果你已经有了一些编程经验,就会对这些运算熟悉。这些操作符和函数的目的是提供求解真/假命题
的答案。一个重要的应用是控制基于真/假命题的一系列MATLAB命令(通常在M文件中)的流程,或执行次序。
作为所有关系和逻辑表达式的输入,MATLAB把任何非零数值当作真,把零当作假。所有关系和逻辑表达式的输出,对于真,输出为1;对于假,输出为零。
1关系操作符
MATLAB关系操作符包括所有常用的比较。
关系操作符 说明 < 小于 < = 小于或等于 > 大于 > = 大于或等于 = = 等于 ~ = 不等于
MATLAB关系操作符能用来比较两个同样大小的数组(或矩阵),或用来比较一个数组和一个标量。在后一种情况,标量和数组中的每一个元素相比较,结果是与数组大小一样的0,1矩阵或数组。下面给出几个示例 例1-56: » A=1:9, B=9-A A =
1 2 3 4 5 6 7 8 9 B =
8 7 6 5 4 3 2 1 0 » tf=A>4 tf =
0 0 0 0 1 1 1 1 1
找出A中大于4的元素。0出现在A<=4的地方,1出现在A>4的地方。
» tf=(A= =B) tf =
0 0 0 0 0 0 0 0 0
找出A中的元素等于B中的元素。注意,=和= =意味着两种不同的事:= = 比较两个变量,当它们相等时返回1,当它们不相等时返回0;在另一方面, = 被用来将运算的结果赋给一个变量。
» tf=B-(A>2) tf =
8 7 5 4 3 2 1 0 -1
找出A>2,并从B中减去所求得的结果向量。这个例子说明,由于逻辑运算的输出是1和0的数组,它们也能用在数学运算中。
» B=B+(B= =0)*eps B =
Columns 1 through 7
8.0000 7.0000 6.0000 5.0000 4.0000 3.0000 2.0000
Columns 8 through 9 1.0000 0.0000
这是一个演示,表明如何用特殊的MATLAB数eps来代替在一个数组中的零元素,eps近似为2.2e-16。这种特殊的表达式在避免被0除时是很有用的。
» x=(-3:3)/3 x =
-1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000 » sin(x)./x
Warning: Divide by zero ans =
0.8415 0.9276 0.9816 NaN 0.9816 0.9276 0.8415
由于第四个数据是0 ,计算函数sin(x)/x时给出了一个警告。由于sin(0)/0是没定义的,在该处MATLAB结果返回NaN。用eps替代0以后,再试一次,
» x=x+(x= =0)*eps; » sin(x)./x ans =
0.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.8415
现在sin(x)/x在x=0处给出了正确的极限。
2 逻辑操作符
逻辑操作符提供了一种组合或否定关系表达式。MATLAB逻辑操作符包括:
逻辑操作符 说明 & 与 | 或 ~ 非
逻辑操作符用法的一些例子有: » A=1:9;B=9-A;
» tf=A>4 tf =
0 0 0 0 1 1 1 1 1
找出A大于4。
» tf=~(A>4) tf =
1 1 1 1 0 0 0 0 0
对上面的结果取非,也就是1替换0,0替换1。
» tf=(A>2)&(A<6) tf =
0 0 1 1 1 0 0 0 0
在A大于2‘与’A小于6处返回1。 最后,上面的功能易于产生数组来表示不连续信号,或由多段其他信号所组成的信号。基本想法是,把数组中要保持的那些值与1相乘,所有其他值与0相乘。例如, 例1-57: » x=linspace(0, 10, 100); % 产生0~10之间的100个数 y=sin(x) ; % 对每个数计算SIN值
z=(y>=0).*y ; % 对Y中>=0的数保持不变,其余取0 z=z+0.5*(y<0) ; % 继续对Y中<0的数加上0.5 z=(x<=8).*z ; % 继续对Z中坐标8以后的值取0 plot(x, z)
xlabel(' x '), ylabel(' z=f(x) '), title(' A Discontinuous Signal ')
A Discontinuous Signal10.90.80.70.6z=f(x)0.50.40.30.20.10024x6810 图1 不连续信号
3 关系与逻辑函数
除了上面的关系与逻辑操作符,MATLAB提供了大量的其他关系与逻辑函数,包括:
其 他 关 系 与 逻 辑 函 数
xor(x,y) 异或运算。x或y非零(真)返回1,x和y都是零(假)或都是非零(真)返
回0。
any(x) 如果在一个向量x中,任何元素是非零,返回1;矩阵x中的每一列有
非零
元素,返回1。
all(x) 如果在一个向量x中,所有元素非零,返回1;矩阵x中的每一列所有
元素
非零,返回1。
除了这些函数,MATLAB还提供了大量的函数,测试特殊值或条件的存在,返回逻辑值。
测 试 函 数
finite 元素有限,返回真值。 isempty 参量为空,返回真值。 isglobal 参量是一个全局变量,返回真值。 ishold 当前绘图保持状态是‘ON’,返回真值。
isieee isinf isletter isnan isreal isspace isstr isstudent isunix isvms
计算机执行IEEE算术运算,返回真值。 元素无穷大,返回真值。 元素为字母,返回真值。 元素为不定值,返回真值。 参量无虚部,返回真值。 元素为空格字符,返回真值。 参量为一个字符串,返回真值。 MATLAB为学生版,返回真值。 计算机为UNIX系统,返回真值。 计算机为VMS系统,返回真值。
1-3-3 MATLAB控制流 1.for循环结构
For循环允许一组命令以固定的和预定的次数重复。For循环的一般形式是: for 循环参数 = 初值:步长:终值 ( --数组) 语句 end
在for和end语句之间的语句按数组中的每一列执行一次。在每一次迭代中,循
环参数被指定为数组的下一列 例1-58:一个简单的for循环示例。 for i=1:10;
x(i)=i; end;
x
%要求显示运行后数组x的值。
%i依次取1,2,…10,.
%对每个i值,重复执行由该指令构成的循环体,
x =
1 2 3 4 5 6 7 8 9 10 For循环的其它重要方面是:
(1.) For循环不能用For循环内重新赋值循环变量n来终止。 » for n=1:10
x(n)=sin(n*pi/10); n=10; end » x
x =
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
(2). 语句1 :10 是一个标准的MATLAB数组创建语句。在For循环内接受任何有效的MATLAB数组。 » data=[3 9 45 6; 7 16 data = 3 9 45 6 7 16 -1 5 for n=data x=n(1)-n(2) end x = -4 x = -7 x = 46 x = 1
(3). For循环可按需要嵌套。 for n=1:5 for m=5:-1:1 A(n,m)=n^2+m^2; end disp(n) end 1 2 3 4 5 » A A = 2 5 10 17 -1 5] 26
5 8 13 20 29 10 13 18 25 34 17 20 25 32 41 26 29 34 41 50
(4). 当有一个等效的数组方法来解给定的问题时,应避免用For循环。例如,上面的第一个例子可被重写为 » n=1:10; » x=sin(n*pi/10) x =
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
两种方法得出同样的结果,而后者执行更快,更直观,要求较少的输入。
(5). 为了得到最大的速度,在For循环(While循环)被执行之前,应预先分配数组。例如,前面所考虑的第一种情况,在For循环内每执行一次命令,变量x的大小增加1。迫使MATLAB每通过一次循环要花费时间对x分配更多的内存。为了消去这个步骤,For循环的例子应重写为 »x=zeros(1,10); % preallocated memory for x » for n=1:10 x(n)=sin(n*pi/10); end
现在,只有x(n)的值需要改变。 2.while循环结构
与For循环以固定次数求一组命令的值相反,While 循环以不定的次数求一组语句的值。While循环的一般形式是:
while 关系表达式 语句 end
只要在表达式里的所有元素为真,就执行while和end 语句之间的{commands}。通常,表达式的求值给出一个标量值,但数组值也同样有效。在数组情况下,所得到数组的所有元素必须都为真。
ak2akak1 ,(k1,2,);例1-59:Fibonacci数组的元素满足Fibonacci 规则:
且a1a21。现要求该数组中第一个大于10000的元素。
a(1)=1;a(2)=1;i=2; while a(i)<=10000
a(i+1)=a(i-1)+a(i); %当现有的元素仍小于10000时,求解下一
个元素。
i=i+1; end;
i,a(i), i =
21 ans =
10946 3.if-else-end分支结构
很多情况下,命令的序列必须根据关系的检验有条件地执行。在编程语言里,这种逻辑由某种If-Else-End结构来提供。 最简单的If-Else-End结构是:
if 关系表达式 {commands} end
如果在表达式中的所有元素为真(非零),那么就执行if和end语言之间的{commands}。If-Else-End结构是:
if 关系表达式
commands evaluated if True else
commands evaluated if False end
在这里,如果表达式为真,则执行第一组命令;如果表达式是假,则执行第二组命令。
当有三个或更多的选择时,If-Else-End结构采用形式
if关系表达式1
commands evaluated if expression1 is True elseif关系表达式2
commands evaluated if expression2 is True elseif …… . . .
else
commands evaluated if no other expression is True end
最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的If-Else-End结构。而且,最后的else命令可有可无。
例1-60用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。 n=100;a=ones(1,n); for i=3:n
a(i)=a(i-1)+a(i-2); if a(i)>=10000 a(i),
break; %跳出所在的一级循环。 end; end,i ans =
10946 i =
21 4.switch-case结构
例1-61学生的成绩管理,用来演示switch结构的应用。 clear;
%划分区域:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
for
i=1:10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];
Name={' Jack','Marry','Peter',' Rose',' Tom'}; %元胞数组 Mark={72,83,56,94,100};Rank=cell(1,5);
%创建一个含5个元素的构架数组S,它有三个域。
S=struct('Name',Name,'Marks',Mark,'Rank',Rank); %根据学生的分数,求出相应的等级。 for i=1:5
switch S(i).Marks
case 100 %得分为100时 S(i).Rank='满分'; %列为'满分'等级 case a %得分在90和99之间 S(i).Rank=' 优秀'; %列为'优秀'等级 case b %得分在80和89之间 S(i).Rank=' 良好'; %列为'良好'等级 case c %得分在60和79之间 S(i).Rank=' 及格'; %列为'及格'等级 otherwise %得分低于60。 S(i).Rank='不及格'; %列为'不及格'等级 end end
%将学生姓名,得分,登记等信息打印出来。
disp(['学生姓名 ',' 得分 ',' 等级']);disp(' ')
for i=1:5;
disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]); end;
学生姓名 得分 等级
Jack 72 及格 Marry 83 良好
Peter 56 不及格 Rose 94 优秀 Tom 100 满分
1-3-4脚本文件和函数文件 1.脚本文件
由命令语句所构成的M-文件,具有以下特点:
(1)文件变量名必须以 .m作为扩展名;
(2)文件中所涉及变量都是全局变量,在运行过程中,可被当前工作区调用;
2.函数文件
函数文件具有以下特点:
(1)文件变量名必须与函数名相同;
(2)文件的第一行形式必须是: function 因变量 = 函数名(自变量) (3)文件中所涉及变量一般是局部变量;
(4)在函数M文件中,到第一个非注释行为止的注释行是帮助文本。当需要帮助时,返回该文本。
(5)第一行帮助行,名为H1 行,是由lookfor 命令搜索的行。
(6)函数可以有零个或更多个输入参量。函数可以有零个或更多个输出参量。 (7) 函数可以按少于函数M文件中所规定的输入和输出变量进行调用,但不能用多于函数M文件中所规定的输入和输出变量数目。如果输入和输出变量数目多于函数M文件中function 语句一开始所规定的数目,则调用时自动返回一个错误。
(8) 当函数有一个以上输出变量时,输出变量包含在括号内。例如,[V,D] = eig(A)。不要把这个句法与等号右边的[V,D] 相混淆。右边的[V,D] 是由数组V和D 所组成。
例1-62M函数文件示例。 [circle.m]
function sa = circle(r,s)
%CIRCLE plot a circle of radii r 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 色圆面. if nargin>2
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')
disp(q(ki,kj).value); fprintf('\\n'); end
例1-63 MATLAB函数fliplr。
function y = fliplr(x)
% FLIPLR Flip matrix in the left/right direction.
% FLIPLR(X) returns X with row preserved and columns flipped % in the left/right direction.
% X = 1 2 3 becomes 3 2 1 % 4 5 6 6 5 4 %
% See also FLIPUD, ROT90.
% Copyright (c) 1984-94 by The MathWorks, Inc.
[m, n] = size(x); y = x(: , n : -1 : 1);
MATLAB函数linspace :
function y = linspace(d1, d2, n)
% LINSPACE Linearly spaced vector.
% LINSPACE(x1, x2) generates a row vector of 100 linearly % equally spaced points between x1 and x2.
% LINSPACE(x1, x2, N) generates N points between x1 and x2. %
% See also LOGSPACE, :.
% Copyright (c) 1984-94 by The MathWorks, Inc.
if nargin = = 2 n = 100; end
y = [d1+(0:n-2)*(d2-d1)/(n-1) d2] ;
因篇幅问题不能全部显示,请点此查看更多更全内容