MATLAB语言介绍
yxb MATLAB文档 4/19/2011
MATLAB 语言简介
东北大学 薛定宇 (原作)
MATLAB 语言的首创者 Cleve Moler 教授在数值
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
,特别是在数值线性代数的领域中很有影响, 他参与编写了数值分析领域一些著名的著作和两个重要的 Fortran 程序 EISPACK 和LINPACK。他曾在密西根大学、斯坦福大学和新墨西哥大学任数学与计算机科学教授。1980 年前后,当时 的新墨西哥大学计算机系主任 Moler 教授在讲授线性代数课程时,发现了用其他高级语言编程极为不便,便构思并开发了 MATLAB (MATrix LABoratory,即矩阵实验室), 这一软件利用了当时数值线性代数领域最高水平的 EISPACK 和 LINPACK 两大软件包中可靠的子程序,用 Fortran 语言编写了集命令
翻译
阿房宫赋翻译下载德汉翻译pdf阿房宫赋翻译下载阿房宫赋翻译下载翻译理论.doc
、科学计算于一身的一套交互式软件系统。
所谓交互式语言,是指人们给出一条命令,立即就可以得出该命令的结果。该语言无需像 C 和 Fortran 语言那样,首先要求使用者去编写源程序,然后对之进行编译、连接,最终形成可执行文件。这无疑会给使用者带来了极大的方便。早期的 MATLAB 是用 Fortran 语言编写的,只能作矩阵运算;绘图也只能用极其原始的方法,即用星号描点的形式画图;内部函数也只提供了几十个。但即使其当时的功能十分简单,当它作为免费软件出现以来,还是吸引了大批的使用者。
Cleve Moler 和 John Little 等人成立了一个名叫 The MathWorks 的公司,Cleve Moler 一直任该公司的首席科学家。该公司于 1984 年推出了第一个 MATLAB 的商业版本。 当时的 MATLAB 版本已经用 C 语言作了完全的改写,其后又增添了丰富多彩的图形图像处理、多媒体功能、符号运算和它与其他流行软件的接口功能,使得 MATLAB 的功能越来越强大。
The MathWorks 公司于 1992 年推出了具有划时代意义的 MATLAB 4.0 版本,并于 1993 年推出了其微机版, 可以配合 Microsoft Windows 一起使用, 使之应用范围越来越广。 1994 年推出的 4.2 版本扩充了 4.0 版本的功能,尤其在图形界面设计方面更提供了新的方法。
1997 年推出的 MATLAB 5.0 版允许了更多的数据结构,如单元数据、数据结构体、多维矩阵、对象与类等,使其成为一种更方便编程的语言。1999 年初推出的 MATLAB 5.3 版在很多方面又进一步改进了 MATLAB 语言的功能。
2000 年 10 月底推出了其全新的 MATLAB 6.0 正式版(Release 12),在核心数值算法、界面设计、外部接口、应用桌面等诸多方面有了极大的改进。
虽然 MATLAB 语言是计算数学专家倡导并开发的,但其普及和发展离不开自动控制领域学者的贡献。 甚至可以说,MATLAB 语言是自动控制领域学者和工程技术人员捧红的,因为在 MATLAB 语言的发展进程中,许多有代表性的成就和控制界的要求与贡献是分不开的。迄今为止,大多数工具箱也都是控制方面的。MATLAB 具有强大的数学运算能力、方便实用的绘图功能及语言的高度集成性,它在其他科学与工程领域的应用也是越来越广,并且有着更广阔的应用前景和无穷无尽的潜能。
1
yxb MATLAB文档 4/19/2011
子曰:“工欲善其事,必先利其器”。如果有一种十分有效的工具能解决在教学与研究中遇到的问题,那么 MATLAB 语言正是这样的一种工具。它可以将使用者从繁琐、无谓的底层编程中解放出来,把有限的宝贵时间更多地花在解决问题中,这样无疑会提高工作效率。
目前,MATLAB 已经成为国际上最流行的科学与工程计算的软件工具,现在的 MATLAB 已经不仅仅是一个“矩阵实验室”了,它已经成为了一种具有广泛应用前景的全新的计算机高级编程语言了,有人称它为“第四代”计算机语言,它在国内外高校和研究部门正扮演着重要的角色。MATLAB 语言的功能也越来越强大,不断适应新的要求提出新的解决方法。可以预见,在科学运算、自动控制与科学绘图领域 MATLAB 语言将长期保持其独一无二的地位。
作者曾在清华大学出版社出版过多部关于 MATLAB 语言及其在科学运算、控制系统等方面的著作,建立本站的宗旨也是为促进 MATLAB 语言及其工具箱在国内同行中的普及。
MATLAB 特色举例
考虑两个矩阵 A 和 B 的乘积问题,在 C 语言中要实现两个矩阵的乘积并不仅仅是一组双重循环的问题。双重循环当然是矩阵乘积所必需的,除此之外要考虑的问题很多。例如:A 和 B 有一个是复数矩阵怎么考虑;其中一个是复数矩阵时怎么考虑;全部是实系数矩阵时又怎么管理;这样就要在一个程序中有 4 个分支,分别考虑这 4 种情况。然后还得判断这两个矩阵是否可乘。而考虑两个矩阵是否可乘也并不仅仅是判断 A 的列数是否等于 B 的行数这么简单。其中一个若为标量,则它们可以无条件地相乘。其中有标量时又得考虑实数与复数的问题等。所以说,没有几十分钟的时间,用 C 语言并不可能编写出考虑各种情况的子程序。有了 MATLAB 这样的工具,A 和 B 矩阵的乘积用 A*B 这样简单的算式就能表示了。 〖例 1-1〗矩阵生成与运算。考虑金庸作品中经常提及的一个“数学问题”, 该问题用半数学语言描述就是:如何生成一个 3x3 矩阵, 并将自然数 1, 2, ..., 9 分别置成这 9 个矩阵元素,才能使得每一行、每一列、且主、反对角线上元素相加都等于一个相同的数。
这样的矩阵称为“魔方矩阵”。用 MATLAB 的 magic() 函数,我们可以由下面的命令立即生成这样的矩阵:
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
还可以由 B=magic(10) 一次生成 10x10 的魔方矩阵。如果想求出矩阵的行列式和特征值,可以分别由 det(B) 与 eig(B) 立即得出结果,而同样的工作在 C 下并不是很简单就可以得出的,算法选择不好,还可能得出错误的结果。
〖例 1-2〗考虑一个二元函数
如何用三维图形的方式表现出这个曲面,
2
yxb MATLAB文档 4/19/2011
用 C 这类语言,绘制图形是一个难点,且从一个机器移植程序到另一个机器,大部分调试程序时间都花在这上。但使用 MATLAB 这类高级语言,完成这样的工作就是几个直观语句的事。且得出的图形美观准确、可以将语句毫不变化地移植到另外的机器上,得出完全一致的结果,如下所示。
>> [x,y] = meshgrid(-3:1/8:3);
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2)- 10*(x/5 - x.^3 - y.^5)...
.*exp(-x.^2-y.^2)- 1/3*exp(-(x+1).^2 - y.^2);
surf(x,y,z), shading interp; colorbar
〖例 1-3〗微分方程的数值解法是在科学与工程计算中经常遇到的问题。假设著名的 Lorenz 模型的状态方程表示为:
若令 且初值为,, 为一个小常数,假设
则我们可以由下面的几个语句就可以描述微分方程:
function xdot = lorenzeq(t,x)
xdot=[-8/3*x(1)+x(2)*x(3);
-10*x(2)+10*x(3);
-x(1)*x(2)+28*x(2)-x(3)];
这样下面几个语句就能求解该微分方程,绘制出时间曲线与相空间曲线,如下所示。
>> t_final=100; x0=[0;0;1e-10];
[t,x]=ode45('lorenzeq',[0,t_final],x0);
3
yxb MATLAB文档 4/19/2011
plot(t,x),
figure; plot3(x(:,1),x(:,2),x(:,3)); axis([10 40 -20 20 -20 20]);
〖例 1-5 〗(注,这里的编号采用作者书中的序号) 设有解析函数,利用 MATLAB 的符号运算工具箱可以对该函数进行解析推导,得出诸如高阶导数、积分、Taylor 幂级数展开等。
>> syms x; f='x^2*(sin(x))^2';
diff(f); f1=simple(ans)
f1 =
x-x*cos(2*x)+x^2*sin(2*x)
>> diff(f,x,2); f2=simple(ans)
f2 =
1-cos(2*x)+4*x*sin(2*x)+2*x^2*cos(2*x)
>> diff(f,x,3); f3=simple(ans)
f3 =
6*sin(2*x)+12*x*cos(2*x)-4*x^2*sin(2*x)
>> diff(f,x,4); f4=simple(ans)
f4 =
24*cos(2*x)-32*x*sin(2*x)-8*x^2*cos(2*x)
>> int(f4,x)
ans =
6*sin(2*x)+12*x*cos(2*x)-4*x^2*sin(2*x)
>> taylor(x^2*(sin(x))^2,15,x)
ans =
x^4-1/3*x^6+2/45*x^8-1/315*x^10+2/14175*x^12-2/467775*x^14
〖例 1-6〗 MATLAB 语言可以编写程序,容易地实现图形用户界面。例如作者编写的矩阵处理 matx_proc.m 界面如下。[本程序可以从作者介绍主页下载]
4
yxb MATLAB文档 4/19/2011
MATLAB 支持的数据结构
MATLAB 语言的赋值语句有两种:
, 变量名 = 运算表达式
, [返回变量列表] = 函数名(输入变量列表)
MATLAB 支持变量和常量,其中 pi 为圆周率 ,, 更重要的,MATLAB 支持 IEEE 标准的运算符号,如 Inf 表示无穷大,NaN (Not a Number) 为 0/0, 0*Inf 或 Inf/Inf 等运算结果。MATLAB 变量名应该由字母引导,后面可以跟数字、字母或下划线等符号。MATLAB 是区分变量名字母大小写的。
(1) 矩阵
MATLAB 最基本的数据结构是复数矩阵。输入一个复数矩阵是很简单的事。例如可以给出下面的语句:
>> B=[1+9i,2+8i,3+7j; 4+6j 5+5i,6+4i; 7+3i,8+2j 1i] 其中 >> 为 MATLAB 的提示符。矩阵各行元素由分号分隔,而同行不同元素由逗号或空格分隔。给出了上面的命令,则可以给出下面的结果。
B =
1.0000 + 9.0000i 2.0000 + 8.0000i 3.0000 + 7.0000i
4.0000 + 6.0000i 5.0000 + 5.0000i 6.0000 + 4.0000i
7.0000 + 3.0000i 8.0000 + 2.0000i 0 + 1.0000i 其中,元素 1+9i 表示复数项。有这样的表述方法,实矩阵、向量或标量均可以更容易地输入了。如果赋值表达式末尾有分号,则其结构将不显示,否则将显示出全部结果。
MATLAB 和其他语言不同,它无需事先声明矩阵的维数。下面的语句可以建立一个更大的矩阵
>> B(2,5)=1
B =
1.0000 + 9.0000i 2.0000 + 8.0000i 3.0000 + 7.0000i 0 0
5
yxb MATLAB文档 4/19/2011
4.0000 + 6.0000i 5.0000 + 5.0000i 6.0000 + 4.0000i 0 1.0000
7.0000 + 3.0000i 8.0000 + 2.0000i 0 + 1.0000i 0 0
冒号表达式是 MATLAB 里最具特色的表示方法。其调用格式为 a=s1:s2:s3; 这一语句可以生成一个行向量,其中 s1 为向量的起始值,s2 为步距,而 s3 为向量的终止值。例如 S=0:.1:2*pi; 将产生一个起始于 0, 步距为 0.1, 而终止于 6.2 的向量 (pi 为 MATLAB 保留常量,), 而不是终止于2,。如果写成 S=0:-0.1:2*pi; 则不出现错误,而返回一个空向量。
冒号表达式可以用来提取矩阵元素,例如 B(:,1) 将提取 B 矩阵的第 1 列而 B(1:2,1:2:3) 将提取 B 的前 2 行与 1,3,5 列组成的子矩阵。在矩阵提取时还可以采用end 这样的算符。如 B(2:end,:) 将提取 B 矩阵的后 2 列构成的子矩阵。
(2) 多维数组
多维数组是 MATLAB 在其 5.0 版本开始提供的。假设有 2 个 3x3 矩阵 A1, A23,则可以由下面的命令建立起一个 3x3x2 的数组:A=cat(3,A1,A2)。试验 A1=cat(2,A1,A2) 和 A2=cat(1,A1A2) 将得到什么结果。
对矩阵或多维数组 A 可以使用 size(A) 来测其大小,也可以使用 reshape() 函数重新按列排列。对向量来说,还可以用 length(A) 来测其长度。
不论原数组 A 是多少维的,A(:) 将返回列向量。
(3) 字符串与字符串矩阵
MATLAB 的字符串是由单引号括起来的。如可以使用下面的命令赋值
>> strA='This is a string.'
多个字符串可以用 str2mat() 函数构造出字符串矩阵。如 B=str2mat(strA, 'ksa saj','aa');
字符串变量可以由下表中的命令进行操作:
命令 意义 命令 意义 strcmp(A,B) 比较A和B字符串是否相同。 findstr(A,B) 测试A是否为B的子字符串,或反过来 strrep(A,s1,s2) 在A中用s2替换s1 length(A) 字符串A的长度
deblank(A) 删除A字符串尾部的空格 double(A) 字符串转换双精度数据 (4) 单元数据结构
用类似矩阵的记号将给复杂的数据结构纳入一个变量之下。和矩阵中的圆括号表示下标类似,单元数组由大括号表示下标。
>> B={1,'Alan Shearer',180,[100, 80, 75; 77, 60, 92; 67, 28, 90; 100, 89, 78]}
B =
[1] 'Alan Shearer' [180] [4x3 double] 访问单元数组应该由大括号进行,如第 4 单元中的元素可以由下面的语句得出
>> B{4}
ans =
100 80 75
77 60 92
67 28 90
100 89 78
(5) 结构体
6
yxb MATLAB文档 4/19/2011
MATLAB 的结构体有点象 C 语言的结构体数据结构。每个成员变量用点号表示,如 A.p 表示 A 变量的 p 成员变量。获得该成员比 C 更直观,仍用 A.p 访问,而不用 A->p。用下面的语句可以建立一个小型的数据库。
>> student_rec.number=1;
student_rec.name='Alan Shearer';
student_rec.height=180;
student_rec.test=[100, 80, 75; 77, 60, 92; 67, 28, 90; 100, 89, 78];
>> student_rec
student_rec =
number: 1
name: 'Alan Shearer'
height: 180
test: [4x3 double]
其中 test 成员为单元型数据。删除成员变量可以由 rmfield() 函数进行,添加成员变量可以直接由赋值语句即可。另外数据读取还可以由 setfield 和 getfield 函数完成。
(6) 类与对象
类与对象是 MATLAB 5.* 开始引入的数据结构。在 MATLAB
手册
华为质量管理手册 下载焊接手册下载团建手册下载团建手册下载ld手册下载
中定义了一各很好的类 -- 多项式类。该例子值得细读,去体会类和对象的定义,重载函数编写等信息。事实上,在实际工具箱设计中,用到了很多的类,例如在控制系统工具箱中定义了 LTI (线性时不变系统) 类,并在此基础上定义了其子类:传递函数类 TF, 状态方程类 SS, 零极点类 ZPK 和频率响应类 FR。
举例:我们将通过一个例子来介绍类的构造。 在 MATLAB 语言使用手册中给出了一个很有代表性的例子:多项式类的建立问题。假设我们想为多项式建立一个单独的类,重新定义加、减、乘及乘方等运算,并定义其显示方式。那么建立一个类至少应该执行下面的步骤:(这个例子更详细的情况请参考 MATLAB 手册)
, 首先应该选定一个恰当的名字,例如这里的多项式类可选择为 polynom。
, 以这个名字建立一个子目录,目录的名字前加 @。对本例来说,即应该在当前的工作目录下建立
@polynom 子目录,而这个目录无需在 MATLAB 路径下再指定。
, 编写一个引导函数,函数名应该和类同名。定义类的使用方法:
function p = polynom(a)
if nargin == 0
p.c = []; p = class(p,'polynom');
elseif isa(a,'polynom'), p = a;
else,
p.c = a(:).'; p = class(p,'polynom');
end
可以看出,本函数分三种情况加以考虑:
? 如果不给输入变量,则建立一个空的多项式;
? 如果输入变量 a 已经为多项式类,则将它直接传送给输出变量 p;
? 如果 a 为向量,则将此向量变换成行向量,再构造成一个多项式对象。
, 如果想正确地显示新定义的类,则必需首先定义 display() 函数,并对新定义的类重新定义其基
本运算。对多项式来说,我们可以如下定义有关的函数:
, 要改变显示函数的定义,则需在此目录下重新建立一个新函数 display()。这种重新定义函数的
7
yxb MATLAB文档 4/19/2011 方法又称为函数的重载。显示函数可以如下地重载定义。
function display(p)
disp(' '); disp([inputname(1),' = ']) disp(' '); disp([' ' char(p)]); disp(' '); 注意,这里应该定义的是 display() 而不是 disp()。
, 从上面的定义可见,显示函数要求重载定义 char() 函数,用于把多项式转换成可显示的字符串。 该函数的定义为
function s=char(p)
if all(p.c==0), s ='0';
else
d=length(p.c)-1; s=[];
for a=p.c;
if a~=0;
if~isempty(s)
if a>0, s=[s, ' + '];
else, s=[s, ' - ']; a = -a; end end
if a~=1 | d==0, s=[s, num2str(a)]; if d>0, s=[s, '*']; end
end
if d>=2, s=[s, 'x^', int2str(d)]; elseif d==1, s=[s 'x']; end
end
d=d-1;
end, end
, 仔细研究此函数,可以发现,该函数能自动地按照多项式显示的格式构造字符串。比如,多项式各项用加减号连接,系数与算子之间用乘号连接,而算子的指数由 ^ 表示。再配以显示函数,则可以将此多项式以字符串的形式显示出来。
, 双精度处理:双精度转换函数的重载定义是很简单的。
function c = double(p)
c = p.c;
, 加运算:两个多项式相加,只需将其对应项系数相加即可。这样,加法运算的重载定义 可由下面的函数实现。注意,这里要对 plus() 函数进行重载定义。
function p=plus(a,b)
a=polynom(a); b=polynom(b);
k=length(b.c)-length(a.c);
p=polynom([zeros(1,k) a.c]+[zeros(1,-k) b.c]);
同理,还可以重载定义多项式的减法运算:
function p=minus(a,b)
a=polynom(a); b=polynom(b);
k=length(b.c)-length(a.c);
p=polynom([zeros(1,k) a.c]-[zeros(1,-k) b.c]);
, 乘法运算:多项式的乘法实际上可以表示为系数向量的卷积,可以由 conv() 函数直接获得。 故可以如下重载定义多项式的乘法运算。
8
yxb MATLAB文档 4/19/2011 function p=mtimes(a,b)
a=polynom(a); b=polynom(b); p=polynom(conv(a.c,b.c));
, 乘方运算: 多项式的乘方运算只限于正整数乘方的运算,其 n 次方相当于将该多项式自乘 n 次。若 n=0,则结果为 1。 这样我们就可以重载定义多项式的乘方运算为:
function p=mpower(a,n)
if n>=0, n=floor(n); a=polynom(a); p=1; if n>=1,
for i=1:n, p=p*a; end
end
else, error('Power should be a non-negative integer.')
end
, 多项式求值问题:可以对多项式求值函数 polyval() 进行重载定义。
function y=polyval(a,x)
a=polynom(a); y=polyval(a.c,x);
定义了此类之后,我们就可以方便地进行多项式处理了。例如我们可以建立两个多项式对象 P(s)=x^3+4x^2-7 和 Q(s)=5x^4+3x^3-1.5x^2+7x+8 其相应的~MATLAB 语句为 >> P=polynom([1,4,0,-7]), Q=polynom([5,3,-1.5,7,8])
P =
x^3 + 4*x^2 - 7
Q =
5*x^4 + 3*x^3 - 1.5*x^2 + 7*x + 8 然后调用下面函数就可以得出相应的计算结果
>> P+Q
ans =
5*x^4 + 4*x^3 + 2.5*x^2 + 7*x + 1 >> P-Q
ans =
-5*x^4 - 2*x^3 + 5.5*x^2 - 7*x - 15 >> P*Q
ans =
5*x^7 + 23*x^6 + 10.5*x^5 - 34*x^4 + 15*x^3 + 42.5*x^2 - 49*x - 56
>> X=P^3
X =
x^9 + 12*x^8 + 48*x^7 + 43*x^6 - 168*x^5-336*x^4+147*x^3+588*x^2-343
>> y=polyval(X,[1 2 3 4 5 6])
y =
-8 4913 175616 1771561 10360232 43986977 由于前面的重载定义,下面的表达式也能得出期望的结果
>> P+[1 2 3]
ans =
x^3 + 5*x^2 + 2*x - 4
, 使用 methods() 函数可以列出一个新的类已经定义的方法函数名。
>> methods('polynom')
Methods for class polynom:
9
yxb MATLAB文档 4/19/2011
char double mpower plus polyval
display minus mtimes polynom
变量的运算
(1) MATLAB 变量的代数运算
如果给定两个矩阵 A 和 B, 则我们可以用 A+B, A-B, A*B 可以立即得出其加、减和乘运算的结果。若这两个矩阵数学上不可以这样运算,则将得出错误信息,并终止正在运行的程序。
在 MATLAB 下,如果 A 和 B 中有一个是标量,则可以无条件地进行这样的运算。MATLAB 不介意这些变量是纯实数还是含有虚部的复数。
矩阵的除法实际上就是线性方程的求解,如 Ax=B 这一线性方程的解即为 x=inv(A)*B, 或更简单地 x=A\B。这又称为矩阵的左除,而 x=B/A 称为矩阵的右除。
方阵的乘方可以由 ^ 算符直接得出,如 A^n。用 MATLKAB 这样的语言,你可以轻易地算出 A^0.1, 亦即 A 矩阵开 10 次方得出的主根。
矩阵的点运算也是相当重要的。所谓点运算即两个矩阵相应元素的元素,如 A.*B 得出的是 A 和 B 对应元素的积,故一般情况下 A*B 不等于 A.*B。矩阵的点乘又称为其 Hadamard 积。点运算的概念又可以容易地用到点乘方上,例如 A.^2, A.^A 等都是可以接受的运算式子。
Kronecker 乘积是 MATLAB 在矩阵运算中的另一个有意义的问题,用 kron(A,B) 立即可以得出两个矩阵的 Kronecker 乘积。
(2) 逻辑运算
MATLAB 并没有单独定义逻辑变量。在 MATLAB 中,数值只有 0 和“非 0” 的区分。非 0 往往被认为是逻辑真,或逻辑 1。除了单独两个数值的逻辑运算外,还支持矩阵的逻辑运算,如 A & B, A | B, 和 ~A 分别表示逻辑与、或、非的运算。例如,下面的 A 和 B 矩阵与运算将得出如下结果
>> A=[0 2 3 4;1 3 5 0]; B=[1 0 5 3;1 5 0 5]; A&B
ans =
0 0 1 1
1 1 0 0
(3) 关系表达式与表达式函数
MATLAB 的大于、小于和等于等关系分别由 >、< 和 == 表示。判定方法不完全等同于 C 这类只能处理单个标量的语言。MATLAB 关系表达式返回的是整个矩阵。例如,比较两个矩阵 A 和 B 是否相等,则可以给出如下命令,并得出相应的结果
>> A=[0 2 3 4;1 3 5 0]; B=[1 0 5 3;1 5 0 5]; A==B
ans =
0 0 0 0
1 0 0 0
确实使得 A 和 B 对应元素相等的位将返回 1,否则返回 0。MATLAB 还可以用 >= 和 <= 这样的符号来比较矩阵对应元素的大小。
另外,MATLAB 还提供了 all() 和 any() 两个函数来对矩阵参数作逻辑判定。all() 函数在其中变元全部非 0 时返回 1,而 any() 函数在变元有非零元素返回 1。find() 函数将返回逻辑关系全部满足时的矩阵下标值,这个函数在编程中是相当常用。还可以使用 isnan() 类函数来判定矩阵中是否含有 NaN 型数据。如果有则返回这样参数的下标。此类函数还有 isfinite(), isclass(), ishandle() 等。 (4) 其他运算
MATLAB 还支持其他运算,如取整、求余数等。可以使用 rond)_, fix(), rem() 等来实现。
10
yxb MATLAB文档 4/19/2011
MATLAB 的语句流程与控制
作为一种常用的编程语言,MATLAB 支持各种流程控制结构,如循环结构、条件转移结构、客观结构等另外 MATLAB 还支持一种新的结构 --- 试探结构。
循环语句有两种结构: for ... end 结构和 while ... end 结构。 这两种语句结构不完全相同,各有各的特色。for ... end 语句通常的调用格式为:
for 循环变量=s1:s3:s2
循环体语句组
end
注意,这里的循环语句是以 end 结尾的,这和 C 语言的结构不完全一致。
〖例〗 如果用户想由 MATLAB 求出 1+2+...+100 的值,可以作下列的循环:
>> mysum=0; for i=1:1:100,mysum=mysum+i; end; mysum mysum =
5050
在上面的式子中,可以看到 for 循环语句中 s3 的值为 1。在 MATLAB 实际编程中,如果 s3 的值为 1, 则可以在该语句中省略,故该语句可以简化成 for i=1:100。
在实际编程中,在 MATLAB 下采用循环语句会降低其执行速度,所以前面的程序可以由下面的命令来代替: i=1:100; mysum=sum(i)。在这一语句中,首先生成了一个向量 i, 然后用内部函数 sum() 求出 i 向量的各个元素之和,或更简单地,该语句还可以写成 sum(1:100)。如果前面的 100 改成 10000, 再运行这一程序,则可以明显地看出,后一种方法编写的程序比前一种方法快得多。
MATLAB 并不要求循环点等间距,假设 V 为任意一个向量,则可以用 for i=V 来表示循环。 同样的问题在 while 循环结构下可以表示为
mysum = 0; i=1; while (i<=100), mysum=mysum+i; i=i+1; end
条件转移语句:和 C 语言相象
if 条件式1
条件块语句组1
elseif 条件式2
条件块语句组2
...
else
条件块语句组n+1
end
开关结构:
MATLAB 从 5.0 版开始提供了开关语句结构,其基本语句结构为:
switch 开关表达式
case 表达式1
语句段1
case {表达式2,表达式3,..., 表达式m}
11
yxb MATLAB文档 4/19/2011
语句段2
...
otherwise
语句段n
end
MATLAB 开关语句与 C 有区别:
, 当开关表达式的值等于表达式 1 时,将执行语句段 1,执行完语句段 1 后将转出开关体,无需像
C 语言那样在下一个 case 语句前加 break 语句,所以本结构在这点上和 C 语言是不同的。
, 当需要在开关表达式满足若干个表达式之一时执行某一程序段,则应该把这样的一些表达式用大
括号括起来,中间用逗号分隔。事实上,这样的结构是 MATLAB 语言定义的单元结构, 其具体内
容将在后面叙述。
, 当前面枚举的各个表达式均不满足时,则将执行 otherwise 语句后面的语句段,此语句等价于 C
语言中的 default 语句。
, 在 case 语句引导的各个表达式中,不要用重复的表达式,否则列在后面的开关通路将永远也不
能执行。
, 程序的执行结果和各个 case 语句的次序是无关的。
试探结构:
MATLAB 从 5.2 版本开始提供了一种新的试探式语句结构,其一般的形式为:
try
语句段1
catch
语句段2
end
本语句结构首先试探性地执行语句段 1,如果在此段语句执行过程中出现错误,则将错误信息赋给保留的 lasterr 变量,并放弃这段语句,转而执行语句段 2 中的语句。这种新的语句结构是 C 等语言中所没有的。
MATLAB 函数编写方法与应用
所谓 MATLAB 程序,大致分为两类:M 脚本文件 (M-Script) 和 M 函数 (M-function), 它们均是普通的 ASCII 码构成的文件。M 脚本文件中包含一族由 MATLAB 语言所支持的语句,它类似于 DOS 下的批处理文件,它的执行方式很简单,用户只需在 MATLAB 的提示符 >> 下键入该 M 文件的文件名,这样 MATLAB 就会自动执行该 M 文件中的各条语句,并将结果直接返回到 MATLAB 的工作空间。M 函数格式是 MATLAB 程序设计的主流,一般情况下, 不建议您使用 M 脚本文件格式编程。
MATLAB 的 M 函数是由 function 语句引导的,其基本格式如下:
function [返回变量列表] = 函数名 (输入变量列表)
注释说明语句段, 由 % 引导
输入、返回变量格式的
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
函数体语句
12
yxb MATLAB文档 4/19/2011
这里输入和返回变量的实际个数分别由 nargin 和 nargout 两个 MATLAB 保留变量来给出,只要进入该
函数,MATLAB 就将自动生成这两个变量,不论您是否直接使用这两个变量。返回变量如果多于 1 个,则
应该用方括号将它们括起来,否则可以省去方括号。输入变量和返回变量之间用逗号来分割。注释语句段
的每行语句都应该由百分号 % 引导,百分号后面的内容不执行,只起注释作用。用户采用 help 命令则可
以显示出来注释语句段的内容。此外,正规的变量个数检测也是必要的。如果输入或返回变量格式不正确,则应该给出相应的提示。我们将通过下面的例子来演示函数编程的格式与方法。
〖例 3-〗假设我们想生成一个 nxm 阶的 Hilbert 矩阵, 它的第 i 行第 j 列的元素值为 1/(i+j-1)。我
们想在编写的函数中实现下面几点:
, 如果只给出一个输入参数,则会自动生成一个方阵,即令 m=n
, 在函数中给出合适的帮助信息,包括基本功能、调用方式和参数说明
, 检测输入和返回变量的个数,如果有错误则给出错误信息
如果调用时不要求返回变量,则将显示结果矩阵。其实在编写程序时养成一个好的习惯,无论对程序设
计者还是对程序的维护者、使用者都是大有裨益的。
采用 MATLAB 函数编写格式和上述要求,我们可以编写出一个函数
function A=myhilb(n, m)
%MYHILB a demonstrative M-function.
% A=MYHILB(N, M) generates an N by M Hilbert matrix A.
% A=MYHILB(N) generates an N by N square Hilbert matrix.
% MYHILB(N,M) displays ONLY the Hilbert matrix, but do not return any
% matrix back to the calling function.
%
%See also: HILB.
% Designed by Professor Dingyu XUE, Northeastern University, PRC
% 5 April, 1995, Last modified by DYX at 21 March, 2000
if nargout>1, error('Too many output arguments.'); end
if nargin==1, m=n;
elseif nargin==0 | nargin>2
error('Wrong number of iutput arguments.');
end
A1=zeros(n,m);
for i=1: n
for j=1:m
A1(i,j)=1/(i+j-1);
end, end
if nargout==1, A=A1; elseif nargout==0, disp(A1); end 这样
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
编写的函数用 help 命令可以显示出其帮助信息:
>> help myhilb
MYHILB a demonstrative M-function.
13
yxb MATLAB文档 4/19/2011
A=MYHILB(N, M) generates an N by M Hilbert matrix A.
A=MYHILB(N) generates an N by N square Hilbert matrix.
MYHILB(N,M) displays ONLY the Hilbert matrix, but do not return any
matrix back to the calling function.
See also: HILB.
有了函数之后,可以采用下面的各种方法来调用它,并产生出所需的结果。
>> A=myhilb(3,4)
A =
1.0000 0.5000 0.3333 0.2500
0.5000 0.3333 0.2500 0.2000
0.3333 0.2500 0.2000 0.1667
>> A=myhilb(4)
A =
1.0000 0.5000 0.3333 0.2500
0.5000 0.3333 0.2500 0.2000
0.3333 0.2500 0.2000 0.1667
0.2500 0.2000 0.1667 0.1429
>> myhilb(4)
1.0000 0.5000 0.3333 0.2500
0.5000 0.3333 0.2500 0.2000
0.3333 0.2500 0.2000 0.1667
0.2500 0.2000 0.1667 0.1429
MATLAB 工具箱编写技巧
放入一个目录中的为某种目的专门编写的一组 MATLAB 函数就可以组成一个工具箱。 从某种意义上说,任何一个 MATLAB 语言的使用者都可以是工具箱的作者。在一个工具箱中,应该有一个名为 Contents.m 的文件,用来描述工具箱中所有 MATLAB 函数的名称和意义。在该文件中第 1 行应该给出该工具箱的名称,在第 2
行中给出该工具箱的版本与修改时间等信息。然后分类地给出该工具箱中各类函数的最基本功能。注意,本文件中所有的语句都应该是注释语句,由百分号 % 引导,空行也应该由 % 引导。
另外,因为 MATLAB是一种解释性语言,所以即使在某个或某些函数中存在语法错误,但如果没执行到该语句时可能就不会发现该错误,这在一个成功的程序设计中是不能容许的。要查出某目录中所有的M函数语法错误,首先应该用 cd 命令 进入该目录,然后运行 pcode * 命令进行伪代码转换。因为该命令会将 MATLAB 函数转换成伪代码,而在转换过程中该程序将自动翻译每一条语句,所以一旦发现有语法错误,将会停止翻译,给出错误信息。改正了该语法错误后,再重新执行 pcode 命令,直到没有错误为止。至少这样会保证目录下所有的程序不含有语法错误。
MATLAB 编程技巧
这里只介绍加快MATLAB程序编程效率的建议,其他内容请参见作者著作。
14
yxb MATLAB文档 4/19/2011
因为 MATLAB 语言是一种解释性语言,所以有时 MATLAB 程序的执行速度不是很理想。这里将依照作者
十多年的实际编程经验给出加快 MATLAB 程序执行速度的一些建议和体会。
, 尽量避免使用循环:循环语句及循环体经常被认为是~MATLAB 编程的瓶颈问题。改进这样的状况有两种方法:
(1) 尽量用向量化的运算来代替循环操作。我们将通过如下的例子来演示如何将一般的循环结构转换成向量化的语句。
〖例3.19〗考虑下面无穷级数求和问题:
如果我们只求出其中前有限项,比如 100,000 项之和 (要精确地求出级数的和,无需求 100000 项,几十项往往就能得出满意的精度。这里主要是为了演示循环运算向量化的优越性。),则可以采用下面的常规语句进行计算
>> tic, s=0;
for i=1:100000, s=s+(1/2^i+1/3^i); end, s,toc s =
1.5000
elapsed_time =
1.9700
如果采用向量化的方法,则可以得出下面结果。可以看出,采取向量化的方法比常规循环运算效率要高得多。
>> tic, i=1:100000; s=sum(1./2.^i+1./3.^i), toc s =
1.5000
elapsed_time =
0.3800
(2)在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的。这样也可以显著提高速度。
〖例3.20〗考虑生成一个 5x10000 的 Hilbert 长方矩阵,该矩阵的定义是其第 i 行第 j 列元素为 h_{i,j}=1/(i+j-1)。我们可以由下面语句比较先进行 i=1:5 的循环和后进行该循环的耗时区别,其效果和前面分析的是一致的。
>> tic
for i=1:5
for j=1:10000
H(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
8.6800
15
yxb MATLAB文档 4/19/2011 >> tic,
for j=1:10000
for i=1:5
J(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
25.7000
, 大型矩阵的预先定维
给大型矩阵动态地定维是个很费时间的事。建议在定义大矩阵时,首先用 MATLAB 的内在函数,如zeros() 或 ones() 对之先进行定维,然后再进行赋值处理,这样会显著减少所需的时间的。
再考虑例 3-20 中的问题,如果输入下面的命令
>> tic
H=zeros(5,10000);
for i=1:5
for j=1:10000
H(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
1.0400
则采用预先定维的方法,再结合向量化的方法,我们可以给出下面的 MATLAB 语句。 >> tic
H=zeros(5,10000);
for i=1:5
H(i,:)=1./[i:i+9999];
end
toc
elapsed_time =
0.060
可见,预先定维后,所需要的时间显著地减少了。可以看出,同样一个问题,由于采用了有效的措施,所需的时间就可以从 25.7 秒减少到 0.06 秒,亦即效率提高了 428 倍。
, 对二重循环这样的特殊问题,我们还可以使用 meshgrid() 函数构造两个 5x10000 矩阵 i 和 j,从而直接得出 H 矩阵,更进一步地加快速度。
>> tic, [i,j]=meshgrid(1:5,1:10000); H=1./(i+j-1); toc
elapsed_time =
0
, 优先考虑内在函数
矩阵运算应该尽量采用 MATLAB 的内在函数,因为内在函数是由更底层的编程语言 C 构造的,其执行速度显然快于使用循环的矩阵运算。
16
yxb MATLAB文档 4/19/2011
, 采用有效的算法
在实际应用中,解决同样的数学问题经常有各种各样的算法。例如求解定积分的数值解法在
MATLAB
中就提供了两个函数 quad() 和 quad8(),其中后一个算法在精度、速度上都明显高于前一种方
法。所以说,在科学计算领域是存在“多快好省”的途径的。如果一个方法不能满足要求,可以
尝试其他的方法。
, 应用 Mex 技术
虽然采用了很多措施,但执行速度仍然很慢,比如说耗时的循环是不可避免的,这样就应该考虑
用其他语言,如 C 或 Fortran 语言。按照 Mex 技术要求的格式编写相应部分的程序,然后通过
编译联接,形成在 MATLAB 可以直接调用的动态连接库 (DLL) 文件,这样可以显著地加快运算速
7 章。 度。有关 Mex 技术及其应用的详细内容可参见第
MATLAB 绘图基础
东北大学 薛定宇 (原作)
MATLAB 的二维绘图基础
了解了 MATLAB 的矩阵和向量概念与输入方法之后,MATLAB 的二维绘图再简单也不过了。假设有两个同长度的向量 x 和 y, 则用 plot(x,y) 就可以自动绘制粗话二维图来。如果打开过图形窗口,则在最近打开的图形窗口上绘制此图,如果未打开窗口,则开一个新的窗口绘图。
〖例〗正弦曲线绘制:
>> t=0:.1:2*pi; %生成横坐标向量,使其为 0,0.1,0.2,...,6.2
y=sin(t); % 计算正弦向量
plot(t,y) %绘制图形
这样立即可以得出如图所示的二维图 [4.1(a)]
17
yxb MATLAB文档 4/19/2011 plot() 函数还可以同时绘制出多条曲线,其调用格式和前面不完全一致,但也好理解。 >> y1=cos(t); plot(t,y,t,y1); %或 plot(t,[y; y1]), 即输出为两个行向量组成的矩阵。 图形见 4.1(b)。
plot() 函数最完整的调用格式为:
>> plot(x1,y1,选项1, x2,y2, 选项2, x3,y3, 选项3, ...)
其中所有的选项如表 4.1 所示。一些选项可以连用,如 '-r' 表示红色实线。
由 MATLAB 绘制的二维图形可以由下面的一些命
令简单地修饰。如
>> grid % 加网格线
>> xlabel('字符串') % 给横坐标轴加说明
>> ylabel('字符串') % 给纵坐标轴加说明,
%并自动旋转90度
>> title('字符串') % 给整个图形加图题
得出的图形如右图所示。
axis() 函数可以手动地设置 x,y 坐标轴范围
还可以使用 plotyy() 函数绘制具有两个纵坐标
刻度的图形。
MATLAB 的图形对象简介
MATLAB 从 4.0 版本开始就提出了句柄图形学 (Handle Graphics) 的概念,为面向对象的图形处理提供了十分有用的工具。和早期版本的 MATLAB 相比较,其最大区别在于,它在图形绘制时其中每个图形元素 (比如其坐标轴或图形上的曲线、文字等) 都是一个独立的对象。用户可以对其中任何一个图形元素进行单独地修改,而不影响图形的其他部分,具有这样特点的图形称为向量化的绘图。这种向量化的绘图要求给
18
yxb MATLAB文档 4/19/2011 每个图形元素分配一个句柄 (handle), 以后再对该图形元素做进一步操作时,则只需对该句柄进行操作即可。
MATLAB 5.0 版进一步加强了图形绘制的功能,而 5.3 版绘图又具有自己的新特色。例如它提供了新的图形编辑程序,并定义了一些新的三维绘图函数等。本章将主要介绍 MATLAB 5.3 版本的应用与特性,并介绍部分有关句柄图形学的内容。其余有关句柄图形学的问题,如窗口特性设置、图形界面设计等项内容将在第 6 章中讲述图形界面设计内容时详细介绍。MATLAB 6 也在图形显示,特别是三维图形显示与照相机参数设置等方面引入了新鲜的内容。
MATLAB 定义的各种图形对象及其关系如下图所示。
对象的通用属性如下表所示。
19
yxb MATLAB文档 4/19/2011
获取和改变对象的属性可以采用 get() 和 set() 函数对来实现。
>> set(句柄, 属性1,属性值1, 属性2,属性值2,...)
>> 属性值=get(句柄,属性)
坐标轴对象时 MATLAB 图形中常用的对象,坐标轴对象可以用 MATLAB 5.3 上的菜单项添加。添加之后,可以用鼠标改变其大小和形状,其他一些属性说明如下:
, Box 属性: 表示是否需要坐标轴上的方框,选项可以为 'on' 和 'off', 默认的值为 'on'。本
书中在后面介绍属性值时,将把默认的属性值列在前面。
, ColorOrder 属性: 设置多条曲线的颜色顺序,应该为一个 n x 3 矩阵, 可以由 colormap() 函
数来设置。
, GridLineStyle 属性: 网格线类型,如实线、虚线等,其设置类似于 plot() 函数的选项,默认
值为 ':',见前面的表格。
, NextPlot 属性: 表示坐标轴图形的更新方式,'replace' 是默认的选项,表示重新绘制,而 'add'
选项表示在原来的图形上叠印,它相当于直接使用 hold on 命令的效果。
, Title 属性: 本坐标轴标题的句柄。而其具体内容由 title() 函数设定,由此句柄就可以访问到
原来的标题了。
, XLabel 属性: x 轴标注的句柄,其内容由 xlabel() 函数设定。此外,类似地还有 YLabel 和
ZLabel 属性等。
, XDir 属性: x 轴方向,可以选择 'normal' (正向) 和 'rev' (逆向), 此外 YDir 和 ZDir 属性
也是类似的。
, XGrid 属性: 表示 x 轴是否加网格线,可选值为 'off' 和 'on', 此外还类似地有 YGrid 和
ZGrid 选项。
, XLim 属性: x 轴上下限,以向量 [xm,xM] 形式给出。此外,还有 YLim 和 ZLim 属性,前面介
绍的 axis() 函数实际上是对这些属性的直接赋值。
, XScale 属性: x 轴刻度类型设置,可以为 'linear' (线性的) 和 'log' (对数的)。此外还有
YScale 和 ZScale 属性。
XTick 和 XTickLabel 属性: XTick 属性将给出 x 轴上标尺点值的向量,而 XTickLabel 将存放这些标尺点上的标记字符串。对 y 和 z 轴也将有相应的标尺属性,如 ZTick 等。
MATLAB 图形上的文字修饰
字符对象及其属性
文字标注是图形修饰中的重要因素,它可以是用户在窗口上随意添加的字符说明,还可以是坐标轴对象中所用到的刻度标志等。字符对象的常用属性如下:
, Color 属性: 字符的颜色。该属性的属性值是一个 1x3 颜色向量。
, FontAngle 属性: 字体倾斜形式。如正常 'normal' 和斜体 'italic' 等。
, FontName 属性: 字体的名称。如 'Times New Roman' 与 'Courier' 等。
, FontSize 属性: 字号大小。默认以 pt 为单位,属性值应该为实数。
, FontWeight 属性: 字体是否加黑。可以选择 'light'、'normal' (默认值)、'demi' 和 'bold' 4
个选项, 其颜色逐渐变黑。
, HorizontalAlignment 属性: 表示文字的水平对齐方式。可以有 'left' (按左边对齐)、'center'
(居中对齐)、'right'(按右边对齐) 三种选择。类似地,对字符矩阵的位置 还有
20
yxb MATLAB文档 4/19/2011
VerticalAlignment 属性。
, FontUnits 属性: 字体大小的单位。如 'points' (磅数,即 pt) 为默认的值,此外, 还可以使
用如下单位 'inches' (英寸)、'centimeters' (厘米)、'normalized' (归一值) 与 'pixels' (像
素) 等。
, Rotation 属性: 字体旋转角度。可以为任何数值。
, Editing 属性: 是否允许交互式修改。选项可以为 'on' 和 'off'。
, String 属性: 构成本字符对象的字符串。可以是字符串矩阵。
, Interpreter 属性: 是否允许 TeX 格式。选项为 'tex' (允许 TeX 格式) 和 'none' (不允许)
两种,前者显示的效果好,而后者速度快。
, Extent 属性: 字符串所在的位置范围,是只读型的,1x4 向量,前两个值表示字符串所在位置的
左下角坐标,而后两个分量分别为字符对象的长和高。
MATLAB 字符串中可以直接使用的一些 TeX 命令见表 4-3。
〖例〗给出下面的MATLAB命令
>> t=['\partial(f_ip)/\partialt=-\Sigma_{i=1}^n\partial(f_ip)/',...
'\partialx_i + 0.5\Sigma_{i=1}^n\Sigma_{j=1}^n',...
21
yxb MATLAB文档 4/19/2011
'\partial^2(b_{ij}p)/\partialx_i\partialx_j'];
tt=str2mat(t,'Y(\omega)=\int_0^\infty y(t)e^{-j\omegat}dt');
[x,y]=ginput(1); text(x,y,tt);
则将得出如下图所示的结果。看见较复杂的数学公式也可以在 MATLAB 窗口中显示出来。
〖例〗分形理论是一个很有趣的领域,在这里我们给出一个简单的例子。任意选定一个二维平面上的初始点坐标 (x0, y0),假设我们可以生成一个在 [0,1] 区间上均匀分布的随机数 ,i,那么根据其取值的大小,可以按下面的公式生成一个新的坐标点 (x1,y1):
从新坐标再根据随机数计算下一个点,如此类推。可以将上面的算法编写出下面的 MATLAB 函数
function [x,y]=frac_tree(x0,y0,v,N)
x=[x0; zeros(N-1,1)]; y=[y0; zeros(N-1,1)];
for i=2:N
vv=v(i);
if vv<0.05, y(i)=0.5*y(i-1);
elseif vv<0.45,
x(i)=0.42*(x(i-1)-y(i-1)); y(i)=0.2+0.42*(x(i-1)+y(i-1));
elseif vv<0.85,
x(i)=0.42*(x(i-1)+y(i-1)); y(i)=0.2-0.42*(x(i-1)-y(i-1));
else,
x(i)=0.1*x(i-1); y(i)=0.1*y(i-1)+0.2;
end
end
调用此函数,我们可以由下面的 MATLAB 命令生成
10,000 个这样的点,并将这些点 在 MATLAB 图形窗
口中用点的形式表示出来,如图所示。
>> N=10000; v=rand(N,1);
[x,y]=frac_tree(0,0,v,N);
h=plot(x(1:10000),y(1:10000),'.'),
给出下面的命令可以设置绘图点的大小:
>> set(h,'MarkerSize',4)
对大的 N 值,计算量大,可以考虑采用MEX C格式
22
yxb MATLAB文档 4/19/2011 改写 MATLAB 函数以加快速度。
MATLAB基本运算与函数
在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可。例如: >>(5*2+1.3-0.8)*10/25
ans =
4.2000
MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer),并显示其数值於萤幕上。(为简便起见,在下述各例中,我们不再印出MATLAB的提示号。)
小提示:
">>"是MATLAB的提示符号(Prompt),但在PC中文视窗系统下,由於编码方式不同,此提示符号常会消失不见,但这并不会影响到MATLAB的运算结果。
我们也可将上述运算式的结果设定给另一个变数x:
x = (5*2+1.3-0.8)*10^2/25
x =
42
此时MATLAB会直接显示x的值。由上例可知,MATLAB认识所有一般常用到的加(+)、减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。
小提示:
MATLAB将所有变数均存成double的形式,所以不需经过变数宣告(Variable declaration)。MATLAB同时也会自动进行记忆体的使用和回收,而不必像C语言,必须由使用者一一指定。这些功能使的MATLAB易学易用,使用者可专心致力於撰写程式,而不必被软体枝节问题所干扰。
若不想让MATLAB每次都显示运算结果,只需在运算式最後加上分号(;)即可,如下例: y = sin(10)*exp(-0.3*4^2);
若要显示变数y的值,直接键入y即可:
>>y
y =
23
yxb MATLAB文档 4/19/2011
-0.0045
在上例中,sin是正弦函数,exp是指数函数,这些都是MATLAB常用到的数学函数。下表即为MATLAB常用
的基本数学函数及三角函数:
小整理:MATLAB常用的基本数学函数
abs(x):纯量的绝对值或向量的长度
angle(z):复数z的相角(Phase angle) sqrt(x):开平方
real(z):复数z的实部
imag(z):复数z的虚部
conj(z):复数z的共轭复数
round(x):四舍五入至最近整数
fix(x):无论正负,舍去小数至最近整数 floor(x):地板函数,即舍去正小数至最近整数 ceil(x):天花板函数,即加入正小数至最近整数 rat(x):将实数x化为分数表示
rats(x):将实数x化为多项分数展开
sign(x):符号函数 (Signum function)。 当x<0时,sign(x)=-1;
当x=0时,sign(x)=0;
当x>0时,sign(x)=1。
rem(x,y):求x除以y的馀数
gcd(x,y):整数x和y的最大公因数
lcm(x,y):整数x和y的最小公倍数
exp(x):自然指数
pow2(x):2的指数
log(x):以e为底的对数,即自然对数或 log2(x):以2为底的对数
log10(x):以10为底的对数
24
yxb MATLAB文档 4/19/2011
小整理:MATLAB常用的三角函数 sin(x):正弦函数
cos(x):馀弦函数
tan(x):正切函数
asin(x):反正弦函数
acos(x):反馀弦函数
atan(x):反正切函数
atan2(x,y):四象限的反正切函数 sinh(x):超越正弦函数
cosh(x):超越馀弦函数
tanh(x):超越正切函数
asinh(x):反超越正弦函数
acosh(x):反超越馀弦函数
atanh(x):反超越正切函数
变数也可用来存放向量或矩阵,并进行各种运算,如下例的列向量(Row vector)运算:
x = [1 3 5 2];
y = 2*x+1
y =
3 7 11 5
小提示:变数命名的规则
1. 第一个字母必须是英文字母
2. 字母间不可留空格
3. 最多只能有19个字母,MATLAB会忽略多馀字母
我们可以随意更改、增加或删除向量的元素: y(3) = 2 % 更改第三个元素
y =
3 7 2 5
y(6) = 10 % 加入第六个元素
25
yxb MATLAB文档 4/19/2011 y =
3 7 2 5 0 10
y(4) = [] % 删除第四个元素,
y =
3 7 2 0 10
在上例中,MATLAB会忽略所有在百分比符号(%)之後的文字,因此百分比之後的文字均可视为程式的注
解(Comments)。MATLAB亦可取出向量的一个元素或一部份来做运算: x(2)*3+y(4) % 取出x的第二个元素和y的第四个元素来做运算 ans =
9
y(2:4)-1 % 取出y的第二至第四个元素来做运算
ans =
6 1 -1
在上例中,2:4代表一个由2、3、4组成的向量,同样的方法可用於产生公差为1的等差数列:
x = 7:16
x =
7 8 9 10 11 12 13 14 15 16
若不希望公差为1,则可将所需公差直接至於4与13之间: x = 7:3:16 % 公差为3的等差数列
x =
7 10 13 16
事实上,我们可利用linspace来产生任意的等差数列: x = linspace(4, 10, 6) % 等差数列:首项为4,末项为10,项数为6 x =
26
yxb MATLAB文档 4/19/2011 4.0000 5.2000 6.4000 7.6000 8.8000 10.0000
若对MATLAB函数用法有疑问,可随时使用help来寻求线上支援(on-line help): help linspace
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, :.
小整理:MATLAB的查询命令
help:用来查询已知命令的用法。例如已知inv是用来计算反矩阵,键入help inv即可得知有关inv命令
的用法。(键入help help则显示help的用法,请试看看~)
lookfor:用来寻找未知的命令。例如要寻找计算反矩阵的命令,可键入lookfor inverse,MATLAB即会列
出所有和关键字inverse相关的指令。找到所需的命令後,即可用help进一步找出其用法。(lookfor事
实上是对所有在搜寻路径下的M档案进行关键字对第一注解行的比对,详见後叙。) 将列向量转置(Transpose)後,即可得到行向量(Column vector): z = x'
z =
4.0000
5.2000
6.4000
7.6000
8.8000
10.0000
不论是行向量或列向量,我们均可用相同的函数找出其元素个数、最大值、最小值等: length(z) % z的元素个数
27
yxb MATLAB文档 4/19/2011
ans =
6
max(z) % z的最大值
ans =
10
min(z) % z的最小值
ans =
4
小整理:适用於向量的常用函数有: min(x): 向量x的元素的最小值
max(x): 向量x的元素的最大值
mean(x): 向量x的元素的平均值
median(x): 向量x的元素的中位数
std(x): 向量x的元素的标准差
diff(x): 向量x的相邻元素的差
sort(x): 对向量x的元素进行排序(Sorting) length(x): 向量x的元素个数
norm(x): 向量x的欧氏(Euclidean)长度 sum(x): 向量x的元素总和
prod(x): 向量x的元素总乘积
cumsum(x): 向量x的累计元素总和
cumprod(x): 向量x的累计元素总乘积 dot(x, y): 向量x和y的内积
cross(x, y): 向量x和y的外积
(大部份的向量函数也可适用於矩阵,详见下述。) 若要输入矩阵,则必须在每一列结尾加上分号(;),如下例:
A = [1 2 3 4; 5 6 7 8; 9 10 11 12]; A
A =
28
yxb MATLAB文档 4/19/2011
1 2 3 4
5 6 7 8
9 10 11 12
同样地,我们可以对矩阵进行各种处理: A(2,3) = 5 % 改变位於第二列,第三行的元素值 A =
1 2 3 4
5 6 5 8
9 10 11 12
B = A(2,1:3) % 取出部份矩阵B
B =
5 6 5
A = [A B'] % 将B转置後以行向量并入A A =
1 2 3 4 5
5 6 5 8 6
9 10 11 12 5
A(:, 2) = [] % 删除第二行(:代表所有列) A =
1 3 4 5
5 5 8 6
9 11 12 5
A = [A; 4 3 2 1] % 加入第四列 A =
29
yxb MATLAB文档 4/19/2011 1 3 4 5
5 5 8 6
9 11 12 5
4 3 2 1
A([1 4], :) = [] % 删除第一和第四列(:代表所有行)
A =
5 5 8 6
9 11 12 5
这几种矩阵处理的方式可以相互叠代运用,产生各种意想不到的效果,就看各位的巧思和创意。 小提示:
在MATLAB的内部资料结构中,每一个矩阵都是一个以行为主(Column-oriented)的阵列(Array)因此对於矩阵元素的存取,我们可用一维或二维的索引(Index)来定址。举例来说,在上述矩阵A中,位於第二列、第三行的元素可写为A(2,3) (二维索引)或A(6)(一维索引,即将所有直行进行堆叠後的第六个元素)。
此外,若要重新安排矩阵的形状,可用reshape命令:
B = reshape(A, 4, 2) % 4是新矩阵的列数,2是新矩阵的行数
B =
5 8
9 12
5 6
11 5
小提示:
A(:)就是将矩阵A每一列堆叠起来,成为一个行向量,而这也是MATLAB变数的内部储存方式。以前例而言,reshape(A, 8, 1)和A(:)同样都会产生一个8x1的矩阵。。
MATLAB可在同时执行数个命令,只要以逗号或分号将命令隔开:
x = sin(pi/3); y = x^2; z = y*10,
30
yxb MATLAB文档 4/19/2011
z =
7.5000
若一个数学运算是太长,可用三个句点将其延伸到下一行: z = 10*sin(pi/3)* ...
sin(pi/3);
若要检视现存於工作空间(Workspace)的变数,可键入who: who
Your variables are:
testfile x
这些是由使用者定义的变数。若要知道这些变数的详细资料,可键入:
whos
Name Size Bytes Class
A 2x4 64 double array
B 4x2 64 double array
ans 1x1 8 double array
x 1x1 8 double array
y 1x1 8 double array
z 1x1 8 double array
Grand total is 20 elements using 160 bytes 使用clear可以删除工作空间的变数:
clear A
A
??? Undefined function or variable 'A'.
31
yxb MATLAB文档 4/19/2011
另外MATLAB有些永久常数(Permanent constants),虽然在工作空间中看不 到,但使用者可直接取用,
例如:
pi
ans =
3.1416
下表即为MATLAB常用到的永久常数。
小整理:MATLAB的永久常数
i或j:基本虚数单位(即)
eps:系统的浮点(Floating-point)精确度
inf:无限大, 例如1/0
nan或NaN:非数值(Not a number),例如0/0 pi:圆周率 (= 3.1415926...)
realmax:系统所能表示的最大数值
realmin:系统所能表示的最小数值
nargin: 函数的输入引数个数
nargin: 函数的输出引数个数
1-2、重复命令
最简单的重复命令是圈(for-loop),其基本形式为: for 变数 = 矩阵;
运算式;
end
其中变数的值会被依次设定为矩阵的每一行,来执行介於for和end之间的运算式。因此,若无意外情况,
运算式执行的次数会等於矩阵的行数。
举例来说,下列命令会产生一个长度为6的调和数列(Harmonic sequence):
x = zeros(1,6); % x是一个16的零矩阵
for i = 1:6,
x(i) = 1/i;
32
yxb MATLAB文档 4/19/2011 end
在上例中,矩阵x最初是一个16的零矩阵,在圈中,变数i的值依次是1到6,因此矩阵x的第i
个元素的值依次被设为1/i。我们可用分数来显示此数列:
format rat % 使用分数来表示数值
disp(x)
1 1/2 1/3 1/4 1/5 1/6
圈可以是多层的,下例产生一个16的Hilbert矩阵h,其中为於第i列、第j行的元素为
:
h = zeros(6);
for i = 1:6,
for j = 1:6,
h(i,j) = 1/(i+j-1);
end
end
disp(h)
1 1/2 1/3 1/4 1/5 1/6
1/2 1/3 1/4 1/5 1/6 1/7
1/3 1/4 1/5 1/6 1/7 1/8
1/4 1/5 1/6 1/7 1/8 1/9
1/5 1/6 1/7 1/8 1/9 1/10
1/6 1/7 1/8 1/9 1/10 1/11
小提示:预先配置矩阵
在上面的例子,我们使用zeros来预先配置(Allocate)了一个适当大小的矩阵。若不预先配置矩阵,程
式仍可执行,但此时MATLAB需要动态地增加(或减小)矩阵的大小,因而降低程式的执行效率。所以在使
33
yxb MATLAB文档 4/19/2011 用一个矩阵时,若能在事前知道其大小,则最好先使用zeros或ones等命令来预先配置所需的记忆体(即
矩阵)大小。
在下例中,圈列出先前产生的Hilbert矩阵的每一行的平方和: for i = h,
disp(norm(i)^2); % 印出每一行的平方和
end
1299/871
282/551
650/2343
524/2933
559/4431
831/8801
在上例中,每一次i的值就是矩阵h的一行,所以写出来的命令特别简洁。 令一个常用到的重复命令是圈,其基本形式为: while 条件式;
运算式;
end
也就是说,只要条件示成立,运算式就会一再被执行。例如先前产生调和数列的例子,我们可用
圈改写如下:
x = zeros(1,6); % x是一个16的零矩阵
i = 1;
while i <= 6,
x(i) = 1/i;
i = i+1;
34
yxb MATLAB文档 4/19/2011 end
format short
1-3、逻辑命令
最简单的逻辑命令是if, ..., end,其基本形式为:
if 条件式;
运算式;
end
if rand(1,1) > 0.5,
disp('Given random number is greater than 0.5.'); end
Given random number is greater than 0.5.
1-4、集合多个命令於一个M档案
若要一次执行大量的MATLAB命令,可将这些命令存放於一个副档名为m的档案,并在MATLAB提示号下键
入此档案的主档名即可。此种包含MATLAB命令的档案都以m为副档名,因此通称M档案(M-files)。例
如一个名为test.m的M档案,包含一连串的MATLAB命令,那麽只要直接键入test,即可执行其所包含的
命令:
pwd % 显示现在的目录
ans =
D:\MATLAB5\bin
cd c:\data\mlbook % 进入test.m所在的目录
type test.m % 显示test.m的内容
% This is my first test M-file.
% Roger Jang, March 3, 1997
35
yxb MATLAB文档 4/19/2011 fprintf('Start of test.m!\n');
for i = 1:3,
fprintf('i = %d ---> i^3 = %d\n', i, i^3);
end
fprintf('End of test.m!\n');
test % 执行test.m
Start of test.m!
i = 1 ---> i^3 = 1
i = 2 ---> i^3 = 8
i = 3 ---> i^3 = 27
End of test.m!
小提示:第一注解行(H1 help line)
test.m的前两行是注解,可以使程式易於了解与管理。特别要说明的是,第一注解行通常用来简短说明此M档案的功能,以便lookfor能以关键字比对的方式来找出此M档案。举例来说,test.m的第一注解行包含test这个字,因此如果键入lookfor test,MATLAB即可列出所有在第一注解行包含test的M档案,因而test.m也会被列名在内。
严格来说,M档案可再细分为命令集(Scripts)及函数(Functions)。前述的test.m即为命令集,其效用和将命令逐一输入完全一样,因此若在命令集可以直接使用工作空间的变数,而且在命令集中设定的变数,也都在工作空间中看得到。函数则需要用到输入引数(Input arguments)和输出引数(Output arguments)来传递资讯,这就像是C语言的函数,或是FORTRAN语言的副程序(Subroutines)。举例来说,若要计算一个正整数的阶乘(Factorial),我们可以写一个如下的MATLAB函数并将之存档於fact.m: function output = fact(n)
% FACT Calculate factorial of a given positive integer.
output = 1;
for i = 1:n,
output = output*i;
end
36
yxb MATLAB文档 4/19/2011 其中fact是函数名,n是输入引数,output是输出引数,而i则是此函数用到的暂时变数。要使用此函数,直接键入函数名及适当输入引数值即可:
y = fact(5)
y =
120
(当然,在执行fact之前,你必须先进入fact.m所在的目录。)在执行fact(5)时,MATLAB会跳入一个下层的暂时工作空间(Temperary workspace),将变数n的值设定为5,然後进行各项函数的内部运算,所有内部运算所产生的变数(包含输入引数n、暂时变数i,以及输出引数output)都存在此暂时工作空间中。运算完毕後,MATLAB会将最後输出引数output的值设定给上层的变数y,并将清除此暂时工作空间及其所含的所有变数。换句话说,在呼叫函数时,你只能经由输入引数来控制函数的输入,经由输出引数来得到函数的输出,但所有的暂时变数都会随着函数的结束而消失,你并无法得到它们的值。 小提示:有关阶乘函数
前面(及後面)用到的阶乘函数只是纯粹用来说明MATLAB的函数观念。若实际要计算一个正整数n的阶乘(即n!)时,可直接写成prod(1:n),或是直接呼叫gamma函数:gamma(n-1)。
MATLAB的函数也可以是递式的(Recursive),也就是说,一个函数可以呼叫它本身。举例来说,n! = n*(n-1)!,因此前面的阶乘函数可以改成递式的写法:
function output = fact(n)
% FACT Calculate factorial of a given positive integer recursively.
if n == 1, % Terminating condition
output = 1;
return;
end
output = n*fact(n-1);
在写一个递函数时,一定要包含结束条件(Terminating condition),否则此函数将会一再呼叫自己,永远不会停止,直到电脑的记忆体被耗尽为止。以上例而言,n==1即满足结束条件,此时我们直接将output设为1,而不再呼叫此函数本身。
1-5、搜寻路径
37
yxb MATLAB文档 4/19/2011
在前一节中,test.m所在的目录是d:\mlbook。如果不先进入这个目录,MATLAB就找不到你要执行的M档
案。如果希望MATLAB不论在何处都能执行test.m,那麽就必须将d:\mlbook加入MATLAB的搜寻路径(Search
path)上。要检视MATLAB的搜寻路径,键入path即可: path
MATLABPATH
d:\matlab5\toolbox\matlab\general
d:\matlab5\toolbox\matlab\ops
d:\matlab5\toolbox\matlab\lang
d:\matlab5\toolbox\matlab\elmat
d:\matlab5\toolbox\matlab\elfun
d:\matlab5\toolbox\matlab\specfun
d:\matlab5\toolbox\matlab\matfun
d:\matlab5\toolbox\matlab\datafun
d:\matlab5\toolbox\matlab\polyfun
d:\matlab5\toolbox\matlab\funfun
d:\matlab5\toolbox\matlab\sparfun
d:\matlab5\toolbox\matlab\graph2d
d:\matlab5\toolbox\matlab\graph3d
d:\matlab5\toolbox\matlab\specgraph
d:\matlab5\toolbox\matlab\graphics
d:\matlab5\toolbox\matlab\uitools
d:\matlab5\toolbox\matlab\strfun
d:\matlab5\toolbox\matlab\iofun
d:\matlab5\toolbox\matlab\timefun
d:\matlab5\toolbox\matlab\datatypes
38
yxb MATLAB文档 4/19/2011 d:\matlab5\toolbox\matlab\dde
d:\matlab5\toolbox\matlab\demos
d:\matlab5\toolbox\tour
d:\matlab5\toolbox\simulink\simulink
d:\matlab5\toolbox\simulink\blocks
d:\matlab5\toolbox\simulink\simdemos
d:\matlab5\toolbox\simulink\dee
d:\matlab5\toolbox\local
此搜寻路径会依已安装的工具箱(Toolboxes)不同而有所不同。要查询某一命令是在搜寻路径的何处,可
用which命令:
which expo
d:\matlab5\toolbox\matlab\demos\expo.m
很显然c:\data\mlbook并不在MATLAB的搜寻路径中,因此MATLAB找不到test.m这个M档案: which test
c:\data\mlbook\test.m
要将d:\mlbook加入MATLAB的搜寻路径,还是使用path命令: path(path, 'c:\data\mlbook');
此时d:\mlbook已加入MATLAB搜寻路径(键入path试看看),因此MATLAB已经"看"得到test.m:
which test
c:\data\mlbook\test.m
现在我们就可以直接键入test,而不必先进入test.m所在的目录。 小提示:如何在其启动MATLAB时,自动设定所需的搜寻路径,
如果在每一次启动MATLAB後,都要设定所需的搜寻路径,将是一件很麻烦的事。有两种方法,可以使MATLAB
启动後,即可载入使用者定义的搜寻路径:
39
yxb MATLAB文档 4/19/2011
1. MATLAB的预设搜寻路径是定义在matlabrc.m(在c:\matlab之下,或是其他安装MATLAB的主目
录下),MATLAB每次启动後,即自动执行此档案。因此你可以直接修改matlabrc.m,以加入新的
目录於搜寻路径之中。
1. MATLAB在执行matlabrc.m时,同时也会在预设搜寻路径中寻找startup.m,若此档案存在,则执
行其所含的命令。因此我们可将所有在MATLAB启动时必须执行的命令(包含更改搜寻路径的命
令),放在此档案中。
每次MATLAB遇到一个命令(例如test)时,其处置程序为:
1. 将test视为使用者定义的变数。
2. 若test不是使用者定义的变数,将其视为永久常数。
3. 若test不是永久常数,检查其是否为目前工作目录下的M档案。
4. 若不是,则由搜寻路径寻找是否有test.m的档案。
5. 若在搜寻路径中找不到,则MATLAB会发出哔哔声并印出错误讯息。
以下介绍与MATLAB搜寻路径相关的各项命令。
1-6、资料的储存与载入
有些计算旷日废时,那麽我们通常希望能将计算所得的储存在档案中,以便将来可进行其他处理。MATLAB储存变数的基本命令是save,在不加任何选项(Options)时,save会将变数以二进制(Binary)的方式储存至副档名为mat的档案,如下述:
, save:将工作空间的所有变数储存到名为matlab.mat的二进制档案。
, save filename:将工作空间的所有变数储存到名为filename.mat的二进制档案。
, save filename x y z:将变数x、y、z储存到名为filename.mat的二进制档案。 以下为使用save命令的一个简例:
who % 列出工作空间的变数
Your variables are:
B h j y
ans i x z
save test B y % 将变数B与y储存至test.mat
dir % 列出现在目录中的档案
. 2plotxy.doc fact.m simulink.doc test.m ~$1basic.doc
.. 3plotxyz.doc first.doc temp.doc test.mat
1basic.doc book.dot go.m template.doc testfile.dat
delete test.mat % 删除test.mat
以二进制的方式储存变数,通常档案会比较小,而且在载入时速度较快,但是就无法用普通的文书软体(例如pe2或记事本)看到档案内容。若想看到档案内容,则必
须加上-ascii选项,详见下述:
, save filename x -ascii:将变数x以八位数存到名为filename的ASCII档案。
, save filename x -ascii -double:将变数x以十六位数存到名为filename的ASCII档案。
40
yxb MATLAB文档 4/19/2011 另一个选项是-tab,可将同一列相邻的数目以定位键(Tab)隔开。
小提示:二进制和ASCII档案的比较
在save命令使用-ascii选项後,会有下列现象:
, save命令就不会在档案名称後加上mat的副档名。因此以副档名mat结尾的档案通常是MATLAB
的二进位资料档。
, 通常只储存一个变数。若在save命令列中加入多个变数,仍可执行,但所产生的档案则无法以简
单的load命令载入。有关load命令的用法,详见下述。
, 原有的变数名称消失。因此在将档案以load载入时,会取用档案名称为变数名称。
, 对於复数,只能储存其实部,而虚部则会消失。
, 对於相同的变数,ASCII档案通常比二进制档案大。
由上表可知,若非有特殊需要,我们应该尽量以二进制方式储存资料。
load命令可将档案载入以取得储存之变数:
, load filename:load会寻找名称为filename.mat的档案,并以二进制格式载入。若找不到
filename.mat,则寻找名称为filename的档案,并以ASCII格式载入。
, load filename -ascii:load会寻找名称为filename的档案,并以ASCII格式载入。 若以ASCII格式载入,则变数名称即为档案名称(但不包含副档名)。若以二进制载入,则可保留原有的变数名称,如下例:
clear all; % 清除工作空间中的变数
x = 1:10;
save testfile.dat x -ascii % 将x以ASCII格式存至名为testfile.dat的档案 load testfile.dat % 载入testfile.dat
who % 列出工作空间中的变数
Your variables are:
testfile x
注意在上述过程中,由於是以ASCII格式储存与载入,所以产生了一个与档案名称相同的变数testfile,此变数的值和原变数x完全相同。
1-7、结束MATLAB
有三种方法可以结束MATLAB:
1. 键入exit
2. 键入quit
3. 直接关闭MATLAB的命令视窗(Command window)
MATLAB基本二维绘图命令
MATLAB不但擅长於矩阵相关的数值运算,也适合用在各种科学目视表示(Scientific visualization)。本节将介绍MATLAB基本xy平面及xyz空间的各项绘图命令,包含一维曲线及二维曲面的绘制、列印及存档。
41
yxb MATLAB文档 4/19/2011
plot是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的x及y座标。下例
可画出一条正弦曲线:
close all; x=linspace(0, 2*pi, 100); % 100个点的x座标 y=sin(x); % 对应的y座标
plot(x,y);
小整理:MATLAB基本绘图函数
plot: x轴和y轴均为线性刻度(Linear scale)
loglog: x轴和y轴均为对数刻度(Logarithmic scale) semilogx: x轴为对数刻度,y轴为线性刻度
semilogy: x轴为线性刻度,y轴为对数刻度
若要画出多条曲线,只需将座标对依次放入plot函数即可: plot(x, sin(x), x, cos(x));
42
yxb MATLAB文档 4/19/2011
若要改变颜色,在座标对後面加上相关字串即可:
plot(x, sin(x), 'c', x, cos(x), 'g');
若要同时改变颜色及图线型态(Line style),也是在座标对後面加上相关字串即可: plot(x, sin(x), 'co', x, cos(x), 'g*');
43
yxb MATLAB文档 4/19/2011
小整理:plot绘图函数的叁数
字元 颜色 字元 图线型态
y 黄色 . 点
k 黑色 o 圆
w 白色 x x
b 蓝色 + +
g 绿色 * *
r 红色 - 实线
c 亮青色 : 点线
m 锰紫色 -. 点虚线
-- 虚线 图形完成後,我们可用axis([xmin,xmax,ymin,ymax])函数来调整图轴的范围: axis([0, 6, -1.2, 1.2]);
44
yxb MATLAB文档 4/19/2011
此外,MATLAB也可对图形加上各种注解与处理: xlabel('Input Value'); % x轴注解
ylabel('Function Value'); % y轴注解
title('Two Trigonometric Functions'); % 图形标题 legend('y = sin(x)','y = cos(x)'); % 图形注解 grid on; % 显示格线
我们可用subplot来同时画出数个小图形於同一个视窗之中: subplot(2,2,1); plot(x, sin(x));
45
yxb MATLAB文档 4/19/2011
subplot(2,2,2); plot(x, cos(x));
subplot(2,2,3); plot(x, sinh(x));
subplot(2,2,4); plot(x, cosh(x));
MATLAB还有其他各种二维绘图函数,以适合不同的应用,详见下表。
小整理:其他各种二维绘图函数
bar 长条图
errorbar 图形加上误差范围
fplot 较精确的函数图形
polar 极座标图
hist 累计图
rose 极座标累计图
stairs 阶梯图
stem 针状图
fill 实心图
feather 羽毛图
compass 罗盘图
quiver 向量场图
以下我们针对每个函数举例。
当资料点数量不多时,长条图是很适合的表示方式:
46
yxb MATLAB文档 4/19/2011
close all; % 关闭所有的图形视窗
x=1:10;
y=rand(size(x));
bar(x,y);
如果已知资料的误差量,就可用errorbar来表示。下例以单位标准差来做资料的误差量:
x = linspace(0,2*pi,30);
y = sin(x);
e = std(y)*ones(size(x));
errorbar(x,y,e)
47
yxb MATLAB文档 4/19/2011
对於变化剧烈的函数,可用fplot来进行较精确的绘图,会对剧烈变化处进行较密集的取样,如下例:
fplot('sin(1/x)', [0.02 0.2]); % [0.02 0.2]是绘图范围
若要产生极座标图形,可用polar:
theta=linspace(0, 2*pi);
r=cos(4*theta);
polar(theta, r);
48
yxb MATLAB文档 4/19/2011
对於大量的资料,我们可用hist来显示资料的分 情况和统计特性。下面几个命令可用来验证randn产生的高斯乱数分 :
x=randn(5000, 1); % 产生5000个 m=0,s=1 的高斯乱数
hist(x,20); % 20代表长条的个数
rose和hist很接近,只不过是将资料大小视为角度,资料个数视为距离,并用极座标绘制表示: x=randn(1000, 1);
rose(x);
49
yxb MATLAB文档 4/19/2011
stairs可画出阶梯图:
x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stairs(x,y);
stems可产生针状图,常被用来绘制数位讯号: x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stem(x,y);
50
yxb MATLAB文档 4/19/2011
stairs将资料点视为多边行顶点,并将此多边行涂上颜色: x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
fill(x,y,'b'); % 'b'为蓝色
feather将每一个资料点视复数,并以箭号画出: theta=linspace(0, 2*pi, 20);
z = cos(theta)+i*sin(theta);
feather(z);
51
yxb MATLAB文档 4/19/2011
compass和feather很接近,只是每个箭号的起点都在圆点:
theta=linspace(0, 2*pi, 20);
z = cos(theta)+i*sin(theta);
compass(z);
MATLAB基本三维绘图命令 在科学目视表示(Scientific visualization)中,三度空间的立体图是一个非常重要的技
巧。本章将介绍MATLAB基本XYZ三度空间的各项绘图命令。
52
yxb MATLAB文档 4/19/2011 mesh和plot是三度空间立体绘图的基本命令,mesh可画出立体网状图,plot则可画出立
体曲面图,两者产生的图形都会依高度而有不同颜色。下列命令可画出由函数形成的立体网状图:
x=linspace(-2, 2, 25); % 在x轴上取25点
y=linspace(-2, 2, 25); % 在y轴上取25点
[xx,yy]=meshgrid(x, y); % xx和yy都是21x21的矩阵 zz=xx.*exp(-xx.^2-yy.^2); % 计算函数值,zz也是21x21的矩阵 mesh(xx, yy, zz); % 画出立体网状图
surf和mesh的用法类似:
x=linspace(-2, 2, 25); % 在x轴上取25点
y=linspace(-2, 2, 25); % 在y轴上取25点
[xx,yy]=meshgrid(x, y); % xx和yy都是21x21的矩阵 zz=xx.*exp(-xx.^2-yy.^2); % 计算函数值,zz也是21x21的矩阵 surf(xx, yy, zz); % 画出立体曲面图
53
yxb MATLAB文档 4/19/2011
为了方便测试立体绘图,MATLAB提供了一个peaks函数,可产生一个凹凸有致的曲面,包
含了三个局部极大点及三个局部极小点,其方程式为:
要画出此函数的最快方法即是直接键入peaks:
peaks
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2)
54
yxb MATLAB文档 4/19/2011
我们亦可对peaks函数取点,再以各种不同方法进行绘图。meshz可将曲面加上围裙:
[x,y,z]=peaks;
meshz(x,y,z);
axis([-inf inf -inf inf -inf inf]);
waterfall可在x方向或y方向产生水流效果:
[x,y,z]=peaks;
waterfall(x,y,z);
axis([-inf inf -inf inf -inf inf]);
55
yxb MATLAB文档 4/19/2011
下列命令产生在y方向的水流效果: [x,y,z]=peaks;
waterfall(x',y',z');
axis([-inf inf -inf inf -inf inf]);
meshc同时画出网状图与等高线:
[x,y,z]=peaks;
meshc(x,y,z);
axis([-inf inf -inf inf -inf inf]);
56
yxb MATLAB文档 4/19/2011
surfc同时画出曲面图与等高线:
[x,y,z]=peaks;
surfc(x,y,z);
axis([-inf inf -inf inf -inf inf]);
contour3画出曲面在三度空间中的等高线: contour3(peaks, 20);
axis([-inf inf -inf inf -inf inf]);
57
yxb MATLAB文档 4/19/2011
contour画出曲面等高线在XY平面的投影:
contour(peaks, 20);
plot3可画出三度空间中的曲线:
t=linspace(0,20*pi, 501);
plot3(t.*sin(t), t.*cos(t), t);
58
yxb MATLAB文档 4/19/2011
亦可同时画出两条三度空间中的曲线:
t=linspace(0, 10*pi, 501);
plot3(t.*sin(t), t.*cos(t), t, t.*sin(t), t.*cos(t), -t);
59
yxb MATLAB文档 4/19/2011
MATLAB常用函数
1 MATLAB的基本数学函数 用help elfun可得到基本数学函数及其说明: help elfun
Elementary math functions.
Trigonometric.
sin - Sine.
sinh - Hyperbolic sine.
asin - Inverse sine.
asinh - Inverse hyperbolic sine. cos - Cosine.
cosh - Hyperbolic cosine.
acos - Inverse cosine.
acosh - Inverse hyperbolic cosine. tan - Tangent.
tanh - Hyperbolic tangent.
atan - Inverse tangent.
atan2 - Four quadrant inverse tangent. atanh - Inverse hyperbolic tangent. sec - Secant.
sech - Hyperbolic secant.
asec - Inverse secant.
asech - Inverse hyperbolic secant. csc - Cosecant.
csch - Hyperbolic cosecant.
acsc - Inverse cosecant.
acsch - Inverse hyperbolic cosecant. cot - Cotangent.
coth - Hyperbolic cotangent. acot - Inverse cotangent.
acoth - Inverse hyperbolic cotangent.
Exponential.
exp - Exponential.
log - Natural logarithm.
log10 - Common (base 10) logarithm.
60
yxb MATLAB文档 4/19/2011 log2 - Base 2 logarithm and dissect floating point number.
pow2 - Base 2 power and scale floating point number. sqrt - Square root.
nextpow2 - Next higher power of 2.
Complex.
abs - Absolute value.
angle - Phase angle.
conj - Complex conjugate.
imag - Complex imaginary part.
real - Complex real part.
unwrap - Unwrap phase angle.
isreal - True for real array.
cplxpair - Sort numbers into complex conjugate pairs.
Rounding and remainder.
fix - Round towards zero.
Round towards minus infinity. floor -
ceil - Round towards plus infinity. round - Round towards nearest integer. mod - Modulus (signed remainder after division). rem - Remainder after division.
sign - Signum.
2 基本矩阵及矩阵操作函数
用help elmat可得到基本矩阵和矩阵操作函数及其说明: help elmat
Elementary matrices and matrix manipulation.
Elementary matrices.
zeros - Zeros array.
ones - Ones array.
eye - Identity matrix.
repmat - Replicate and tile array.
rand - Uniformly distributed random numbers. randn - Normally distributed random numbers. linspace - Linearly spaced vector.
logspace - Logarithmically spaced vector.
61
yxb MATLAB文档 4/19/2011 meshgrid - X and Y arrays for 3-D plots. : - Regularly spaced vector and index into matrix.
Basic array information.
size - Size of matrix.
length - Length of vector.
ndims - Number of dimensions.
disp - Display matrix or text.
isempty - True for empty matrix.
isequal - True if arrays are identical. isnumeric - True for numeric arrays.
islogical - True for logical array.
logical - Convert numeric values to logical.
Matrix manipulation.
- Change size. reshape
diag - Diagonal matrices and diagonals of matrix.
Extract lower triangular part. tril -
triu - Extract upper triangular part.
fliplr - Flip matrix in left/right direction. flipud - Flip matrix in up/down direction. flipdim - Flip matrix along specified dimension. rot90 - Rotate matrix 90 degrees.
: - Regularly spaced vector and index into matrix. find - Find indices of nonzero elements. end - Last index.
sub2ind - Linear index from multiple subscripts. ind2sub - Multiple subscripts from linear index.
Special variables and constants.
ans - Most recent answer.
eps - Floating point relative accuracy. realmax - Largest positive floating point number. realmin - Smallest positive floating point number. pi - 3.1415926535897....
i, j - Imaginary unit.
inf - Infinity.
NaN - Not-a-Number.
isnan - True for Not-a-Number.
isinf - True for infinite elements.
isfinite - True for finite elements.
62
yxb MATLAB文档 4/19/2011
flops - Floating point operation count.
why - Succinct answer.
Specialized matrices.
compan - Companion matrix.
gallery - Higham test matrices.
hadamard - Hadamard matrix.
hankel - Hankel matrix.
hilb - Hilbert matrix.
invhilb - Inverse Hilbert matrix.
magic - Magic square.
pascal - Pascal matrix.
rosser - Classic symmetric eigenvalue test problem.
toeplitz - Toeplitz matrix.
vander - Vandermonde matrix.
wilkinson - Wilkinson's eigenvalue test matrix.
3 矩阵函数
help matfun
Matrix functions - numerical linear algebra.
Matrix analysis.
norm - Matrix or vector norm.
normest - Estimate the matrix 2-norm. rank - Matrix rank.
det - Determinant.
trace - Sum of diagonal elements. null - Null space.
orth - Orthogonalization.
rref - Reduced row echelon form. subspace - Angle between two subspaces.
Linear equations.
\ and / - Linear equation solution; use "help slash".
inv - Matrix inverse.
cond - Condition number with respect to inversion.
condest - 1-norm condition number estimate. chol - Cholesky factorization.
cholinc - Incomplete Cholesky factorization. lu - LU factorization.
luinc - Incomplete LU factorization. qr - Orthogonal-triangular decomposition.
63
yxb MATLAB文档 4/19/2011
nnls - Non-negative least-squares.
pinv - Pseudoinverse.
lscov - Least squares with known covariance.
Eigenvalues and singular values.
Eigenvalues and eigenvectors. eig -
svd - Singular value decomposition.
gsvd - Generalized ingular value decomposition. eigs - A few eigenvalues.
svds - A few singular values.
poly - Characteristic polynomial.
polyeig - Polynomial eigenvalue problem. condeig - Condition number with respect to eigenvalues. hess - Hessenberg form.
qz - QZ factorization for generalized eigenvalues. schur - Schur decomposition.
Matrix functions.
expm - Matrix exponential.
Matrix logarithm. logm -
sqrtm - Matrix square root.
funm - Evaluate general matrix function.
Factorization utilities
qrdelete - Delete column from QR factorization. qrinsert - Insert column in QR factorization. rsf2csf - Real block diagonal form to complex diagonal form.
cdf2rdf - Complex diagonal form to real block diagonal form.
balance - Diagonal scaling to improve eigenvalue accuracy.
planerot - Given's plane rotation.
cholupdate - rank 1 update to Cholesky factorization. qrupdate - rank 1 update to QR factorization.
4 数据分析和傅立叶变换
help datafun
Data analysis and Fourier transforms.
Basic operations.
max - Largest component.
min - Smallest component.
mean - Average or mean value.
median - Median value.
std - Standard deviation.
64
yxb MATLAB文档 4/19/2011
sort - Sort in ascending order.
sortrows - Sort rows in ascending order. sum - Sum of elements.
prod - Product of elements.
Histogram. hist -
trapz - Trapezoidal numerical integration. cumsum - Cumulative sum of elements.
cumprod - Cumulative product of elements. cumtrapz - Cumulative trapezoidal numerical integration.
Finite differences.
diff - Difference and approximate derivative. gradient - Approximate gradient.
del2 - Discrete Laplacian.
Correlation.
corrcoef - Correlation coefficients.
cov Covariance matrix. -
subspace - Angle between subspaces.
Filtering and convolution.
filter - One-dimensional digital filter. filter2 - Two-dimensional digital filter. conv - Convolution and polynomial multiplication. conv2 - Two-dimensional convolution.
convn - N-dimensional convolution.
deconv - Deconvolution and polynomial division.
Fourier transforms.
fft - Discrete Fourier transform.
fft2 - Two-dimensional discrete Fourier transform. fftn - N-dimensional discrete Fourier Transform. ifft - Inverse discrete Fourier transform. ifft2 - Two-dimensional inverse discrete Fourier transform.
ifftn - N-dimensional inverse discrete Fourier Transform. fftshift - Shift DC component to center of spectrum. ifftshift - Inverse FFTSHIFT.
Sound and audio.
sound - Play vector as sound.
soundsc - Autoscale and play vector as sound. speak - Convert input string to speech (Macintosh only). recordsound - Record sound (Macintosh only). soundcap - Sound capabilities (Macintosh only).
65
yxb MATLAB文档 4/19/2011
mu2lin - Convert mu-law encoding to linear signal. lin2mu - Convert linear signal to mu-law encoding.
Audio file inport/export.
auwrite - Write NeXT/SUN (".au") sound file. auread - Read NeXT/SUN (".au") sound file. wavwrite - Write Microsoft WAVE (".wav") sound file. wavread - Read Microsoft WAVE (".wav") sound file. readsnd - Read SND resources and files (Macintosh only). writesnd - Write SND resources and files (Macintosh only).
5 插值及多项式
help polyfun
Interpolation and polynomials.
Data interpolation.
interp1 - 1-D interpolation (table lookup). interp1q - Quick 1-D linear interpolation.
-D interpolation using FFT method. interpft - 1
interp2 - 2-D interpolation (table lookup). interp3 - 3-D interpolation (table lookup). interpn - N-D interpolation (table lookup). griddata - Data gridding and surface fitting.
Spline interpolation.
spline - Cubic spline interpolation.
ppval - Evaluate piecewise polynomial.
Geometric analysis.
delaunay - Delaunay triangulation.
dsearch - Search Delaunay triagulation for nearest point. tsearch - Closest triangle search.
convhull - Convex hull.
voronoi - Voronoi diagram.
inpolygon - True for points inside polygonal region. rectint - Rectangle intersection area.
polyarea - Area of polygon.
Polynomials.
roots - Find polynomial roots.
poly - Convert roots to polynomial.
polyval - Evaluate polynomial.
polyvalm - Evaluate polynomial with matrix argument.
66
yxb MATLAB文档 4/19/2011 residue - Partial-fraction expansion (residues).
polyfit - Fit polynomial to data. polyder - Differentiate polynomial. conv - Multiply polynomials.
Divide polynomials. deconv -
6 编程语言结构
help lang
Programming language constructs.
Control flow.
if - Conditionally execute statements.
else - IF statement condition.
elseif - IF statement condition.
Terminate scope of FOR, WHILE, SWITCH, TRY and IF end -
statements.
for - Repeat statements a specific number of times. while - Repeat statements an indefinite number of times. break - Terminate execution of WHILE or FOR loop. switch - Switch among several cases based on expression. case - SWITCH statement case.
otherwise - Default SWITCH statement case.
try - Begin TRY block.
catch - Begin CATCH block.
return - Return to invoking function.
Evaluation and execution.
eval - Execute string with MATLAB expression. feval - Execute function specified by string. evalin - Evaluate expression in workspace.
builtin - Execute built-in function from overloaded method. assignin - Assign variable in workspace.
run - Run script.
Scripts, functions, and variables.
script - About MATLAB scripts and M-files.
function - Add new function.
global - Define global variable.
persistent - Define persistent variable.
67
yxb MATLAB文档 4/19/2011 mfilename - Name of currently executing M-file. lists - Comma separated lists.
exist - Check if variables or functions are defined. isglobal - True for global variables.
Prevent M-file from being cleared. mlock -
munlock - Allow M-file to be cleared.
mislocked - True if M-file cannot be cleared.
Argument handling.
nargchk - Validate number of input arguments. nargin - Number of function input arguments. nargout - Number of function output arguments. varargin - Variable length input argument list. varargout - Variable length output argument list. inputname - Input argument name.
Message display.
error - Display error message and abort function. warning - Display warning message.
lasterr - Last error message.
lastwarn - Last warning message.
errortrap - Skip error during testing. disp - Display an array.
fprintf - Display formatted message.
sprintf - Write formatted data to a string.
Interactive input.
input - Prompt for user input.
keyboard - Invoke keyboard from M-file. pause - Wait for user response.
uimenu - Create user interface menu.
uicontrol - Create user interface control. 7 常规用途命令
help general
General purpose commands. MATLAB Toolbox Version 5.2 18-Dec-1997
General information
help - On-line help, display text at command line.
68
yxb MATLAB文档 4/19/2011
helpwin - On-line help, separate window for navigation.
helpdesk - Comprehensive hypertext documentation and troubleshooting.
demo - Run demonstrations.
MATLAB, SIMULINK, and toolbox version information. ver -
whatsnew - Display Readme files.
Readme - What's new in MATLAB 5.1
Managing the workspace.
who - List current variables.
whos - List current variables, long form. clear - Clear variables and functions from memory. pack - Consolidate workspace memory. load - Load workspace variables from disk. save - Save workspace variables to disk. quit - Quit MATLAB session.
Managing commands and functions.
what - List MATLAB-specific files in directory.
List M-file. type -
edit - Edit M-file.
lookfor - Search all M-files for keyword. which - Locate functions and files. pcode - Create pre-parsed pseudo-code file (P-file). inmem - List functions in memory.
mex - Compile MEX-function.
Managing the search path
path - Get/set search path.
addpath - Add directory to search path. rmpath - Remove directory from search path. editpath - Modify search path.
Controlling the command window.
echo - Echo commands in M-files.
more - Control paged output in command window. diary - Save text of MATLAB session. format - Set output format.
Operating system commands
cd - Change current working directory. copyfile - Copy a file.
pwd - Show (print) current working directory. dir - List directory.
69
yxb MATLAB文档 4/19/2011
delete - Delete file.
getenv - Get environment variable. mkdir - Make directory.
! - Execute operating system command (see PUNCT).
Execute DOS command and return result. dos -
unix - Execute UNIX command and return result. vms - Execute VMS DCL command and return result.
web - Open Web browser on site or files. computer - Computer type.
Debugging M-files.
debug - List debugging commands. dbstop - Set breakpoint.
dbclear - Remove breakpoint.
dbcont - Continue execution.
dbdown - Change local workspace context. dbstack - Display function call stack. dbstatus - List all breakpoints.
dbstep - Execute one or more lines.
List M-file with line numbers. dbtype -
dbup - Change local workspace context. dbquit - Quit debug mode.
dbmex - Debug MEX-files (UNIX only).
Profiling M-files.
profile - Profile M-file execution time.
See also PUNCT.
8 低级函数,文件输入/输出,
help iofun
File input/output.
File opening and closing.
fopen - Open file.
fclose - Close file.
Binary file I/O.
fread - Read binary data from file. fwrite - Write binary data to file.
Formatted file I/O.
fscanf - Read formatted data from file.
70
yxb MATLAB文档 4/19/2011
fprintf - Write formatted data to file. fgetl - Read line from file, discard newline character.
fgets - Read line from file, keep newline character. input - Prompt for user input.
String conversion.
sprintf - Write formatted data to string. sscanf - Read string under format control.
File positioning.
ferror - Inquire file error status. feof - Test for end-of-file.
fseek - Set file position indicator. ftell - Get file position indicator. frewind - Rewind file.
File name handling
matlabroot - Root directory of MATLAB installation. filesep - Directory separator for this platform. pathsep - Path separator for this platform. mexext - MEX filename extension for this platform. fullfile - Build full filename from parts. fileparts - Filename parts.
partialpath - Partial pathnames.
tempdir - Get temporary directory.
tempname - Get temporary file.
File import/export functions.
load - Load workspace from MAT-file. save - Save workspace to MAT-file.
dlmread - Read ASCII delimited file. dlmwrite - Write ASCII delimited file. wk1read - Read spreadsheet (WK1) file. wk1write - Write spreadsheet (WK1) file. hdf - MEX-file interface to the HDF library.
Image file import/export.
imread - Read image from graphics file. imwrite - Write image to graphics file. imfinfo - Return information about graphics file.
Audio file import/export.
auwrite - Write NeXT/SUN (".au") sound file. auread - Read NeXT/SUN (".au") sound file.
71
yxb MATLAB文档 4/19/2011
wavwrite - Write Microsoft WAVE (".wav") sound file.
wavread - Read Microsoft WAVE (".wav") sound file.
Command window I/O
clc Clear command window. -
home - Send cursor home.
disp - Display array.
input - Prompt for user input.
pause - Wait for user response.
9 二维图形
help graph2d
Two dimensional graphs.
Elementary X-Y graphs.
plot - Linear plot.
Log-log scale plot. loglog -
semilogx - Semi-log scale plot.
-log scale plot. semilogy - Semi
polar - Polar coordinate plot.
plotyy - Graphs with y tick labels on the left and right.
Axis control.
axis - Control axis scaling and appearance. zoom - Zoom in and out on a 2-D plot. grid - Grid lines.
box - Axis box.
hold - Hold current graph.
axes - Create axes in arbitrary positions. subplot - Create axes in tiled positions. daspect - Data aspect ratio.
pbaspect - Plot box aspect ratio. xlim - X limits.
ylim - Y limits.
Graph annotation.
legend - Graph legend.
title - Graph title.
xlabel - X-axis label.
ylabel - Y-axis label.
text - Text annotation.
gtext - Place text with mouse.
plotedit - Experimental graph editing and annotation tools.
72
yxb MATLAB文档 4/19/2011
Hardcopy and printing.
print - Print graph or SIMULINK system; or save graph to M-file.
printopt - Printer defaults.
Set paper orientation. orient -
See also GRAPH3D, SPECGRAPH.
73