第二章 MATLAB语言编程
本书的主要内容是关于控制系统的分析、设计和仿真,用到的工具软件是Matlab,因
此熟悉和理解 Matlab 语言至关重要。本章把 Matlab 作为一种编程语言介绍给读者,主要
介绍 MATLAB 的基础知识,包括数据类型、运算符、基本语句、矩阵、多项式等,同时
还简要介绍了数据的可视化实现,为以后应用Matlab编写控制系统设计、仿真程序打下良
好的基础。
2.1 数据类型和运算符
2.1.1变量、语句
1、变量
z 变量命名规则
为变量(包括函数)命名时应该遵循以下的规则:
⑴必须以字母开头;
⑵可以由字母、数字和下划线混合组成;
⑶变量长度应不大于 31个;
⑷字母区分大小写。
z 变量的定义
Matlab对于变量的定义和声明要求非常宽松,使用变量前不用专门的语句定义变量的
数据类型,根据语句的执行结果自动指定变量的数据类型和变量的尺寸。
z 特殊变量
为了计算和使用方便,Matlab中定义了一些具有特殊意义的变量(见
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
2-1),这些特
殊变量在工作空间和函数空间都可以使用。
表 2-1特殊变量定义表
变量名称 功能 变量名称 功能
ans 保存最后一次的运算结果 pi 圆周率
realmax 最大的浮点数值 realmin 最小的浮点数值
I 虚数单位 j 虚数单位
Inf 正无穷大 NaN 非数(0/0,Inf/Inf)
z 局部变量和全局变量
通常,每个函数体内都有自己定义的变量,不能从其它函数和 MATLAB 工作空间访
问这些变量,这些变量就是局部变量。如果要使某个变量在几个函数中和 MATLAB 工作
空间都能使用,可以把它定义为全局变量。
全局变量用关键字“global”声明,如果需要在几个函数中和MATLAB工作空间都能
1
访问一个全局变量,则必须在每个函数中和 MATLAB 工作空间都声明该变量为全局的。
全局变量需要在函数体的变量赋值语句之前说明,整个函数以及对函数所有的递归调用都
可以利用全局变量。
2、基本语句
MATLAB是一种解释性语言,它不仅可以在MATLAB命令窗口中键入命令,而且可
以在编辑器内编写应用程序,统一在MATLAB环境下运行处理,并返回运算结果。
MATLAB语言的基本语句结构为:
变量名列表=表达式
其中等号左边的变量名列表为 MATLAB 语句的返回值,若一次返回多个结果,则变
量列表用[]括起来,各变量间用逗号分隔;等号右边为表达式,可以是矩阵运算或函数调
用,可以由分号(;)、逗号(,)或回车结束。如果用分号结束,则左边的变量结果将在屏幕上
不显示,否则将显示左侧变量的值。
2.1.2 数据类型
在MATLAB里共有六种数据类型,每一种类型可以是一维、二维和多维的。这六种是:
双精度型(double)、字符型(char)、稀疏型(sparse)、存储型(storage)、细胞
型(cell)和结构型(struct)。
MATLAB计算都采用双精度,MATLAB提供的绝大部分函数都是对双精度矩阵和字符串操
作的,其他几种数据类型用于特殊的场合。比如存储型可用于图像处理,稀疏型用于稀疏
矩阵,细胞型和结构型一般用于编写大型软件。表2-2列出了这些数据类型的一些例子。
表2-2 数据类型举例
数据类型(class) 举 例 解 释
double [1,2;3,4],5+6i 双精度数值类型,是最常用的类型。
Char ‘Hello’ 字符数组,每个字符占16位。
sparse speye(5) 双精度稀疏矩阵,只存储矩阵中的非0元素
Cell
{[1,2,3;4,5,6;7,8,9]
,‘hello’,eye(2)}
细胞数组,数组中的每个元素可为不同类
型、不同维数。
struct
a.day=12;
a.color=’red’
a.mat=magic(3)
结构数组相当于数据库的
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
,把相关的数
据列在一起,称为属性,不同属性的数据类
型可以不同
storage unit8(magic(3))
8位型,为无符号整数,最大可表示255,不
能进行数学运算。
和其他软件不同,在MATLAB里,不能用double、char来定义变量。变量的数据类型可
以用函数isa来查看,其调用格式为:
isa(变量名,数据类型)
比如:isa(s,‘sparse’),当矩阵s为稀疏矩阵时将返回1。
下面我们重点介绍字符型、结构型、细胞型数据的使用规则和方法。
1、 字符
MATLAB有强大的字符处理能力,其字符处理函数见附录 A中的附表 A-2。
MATLAB中的字符串有几条基本规则:
2
⑴所有字符串都用单引号括起来;
⑵字符串中的每一个字符都是该字符串变量中的一个元素;
⑶字符串中的字符以 ASCⅡ码形式存储,因而区分大小写。
MATLAB中对字符串的常用操作方法主要有:
⑴建立:可以直接赋值或者由其他数值转换得到,常用函数有 char、int2str、num2str、
sprintf等。
⑵连接:水平连接通过函数 strcat 或在中括号内用逗号连接;垂直连接通过函数
strvcat或在中括号内用分号连接。
⑶比较:常用函数 strcmp、strcmpi、strncmp,相同则返回 1,否则为 0。
⑷查找:常用函数 findstr。
2、 结构
MATLAB 中结构的概念与 C 语言中类似,也包含一个或多个域,每个域可以包含任
何类型的数据,而且互相独立。结构的建立和访问有其特有的方法:
①直接建立结构和各个域,同时给各域赋值,结构和域之间用点“.”连接。同样,
访问结构的各个域时,其格式为:
结构名.域名
结构的各个域可以按照其本身的数据类型进行相应的各种运算。
例 2-1: student.name=’Jack’;
student.age=20;
student.phone=’2345678’;
②用函数 struct建立结构,其用法为:
s=struct(‘field1’,values1,‘field2’,values2,┅)
该函数用指定的域名和各个域的数据建立结构数组,如果数组中包含多个结构,而且
各个结构域中的数据不尽相同,那么域的数据 values1、values2┅必须是细胞数组。
例 2-2:%建立一个结构体数组,数组里现在有 2个元素
s = struct('type',{'big',’little’},'color','red','x',{3 1})
s(1).type
s(2).x
s(2).color
%建立一个结构体数组,其中域 data是细胞数组
a.data={‘Hello’,3,[2,3;0,1]};
a.memo=’this is a test’;
a.data{3}
a.data{1}(1)
a.memo(7)
3、 细胞
细胞数组是MATLAB特有的一种数据类型。细胞数组的各个元素可以是不同的数据类
型。细胞数组的访问采用下标访问,用{ }括起来的下标为细胞数组中的第几个元素,用
()括起来的下标为大括号对应的某个元素的分量。可以用两种方法定义细胞数组:
3
(1)用赋值语句直接生成;
例2-3:
a(1,1)={[1 4 3;0 5 8;2 3 5]};
a(1,2)={‘My cat’};
a(2,1)={4+6j};
a(2,2)={0:1:10};
也可以这样赋值:
A{1,1}=[1 4 3;0 5 8;2 3 5];
A{1,2}=’My cat’;
A{2,1}=4+6j;
A{2,2}=0:1:10;
(2)先用cell函数预分配数组,然后对每个元素赋值。
例2-4:B=cell(5,3); %将B定义为5x3的细胞数组
B(2,2)={1:0.1:1};
2.1.3 运算符
MATLAB的运算符可分为三类:算术运算符、关系运算符和逻辑运算符。其中算术运算
符的优先级最高,其次是关系运算符,再其次是逻辑运算符。下面将分别介绍这三类运算
符和逻辑函数。
1.算术运算符
按照运算符的优先级可把算术运算符分为五级,在每一级里运算符有同样的优先级,
在运算时自左向右结合,常见的算术运算符见附录A中的附表A-2。
① .' .^ ' ^
② + - (标量加、减)
③ .* ./ .\ * / \
④ + - (矩阵加、减)
⑤ : (循环)
算术运算符中带有"."表示只对操作数的每个元素作相同的运算,例如C=A.*B表示C
中的每个元素等于A和B中相同位置元素的乘积,而C=A*B代表矩阵的乘积运算。
2.关系运算符
关系运算符对于程序的流程控制非常有用,在MATLAB的循环和条件控制中经常使用。
在MATLAB里共有六个关系运算符,这些运算符和C语言的运算符含义基本相同。
< 小于 > 大于
<= 小于等于 >=大于等于
== 等于 ~=不等于
除了长方形矩阵和向量外,所有的关系运算符连接的两个运算数须是同维、每维同大
小的。对于长方形矩阵和向量,两个运算符或者同维、同大小,或者其中一个为标量。当
有一个运算数是标量时,关系运算符是把标量和另一个运算数的每个元素进行比较。关系
运算符将生成一个0-1矩阵,当运算数相应元素为真时,对应位置上生成1,否则为0。
例2-5:a=[-1,2;3,9];
4
a>=1
运算结果:ans = 0 1
1 1
3.逻辑运算符
MATLAB里共三种逻辑运算符:
& (与) |(或) ~(非)
和关系运算符一样,除了逻辑运算符的一个运算数为长方阵或向量时,另一个运算数
可以为标量。其余情况下均要求矩阵同维。逻辑运算符也对运算数的相应元素一一运算,
最后结果是一个0-1矩阵。当逻辑表达式的值为真时,赋值1,否则为0。
对于数值矩阵,当元素为0时,逻辑上为假;当元素为非0时,逻辑上为真。
4.逻辑函数
MATLAB提供了一些逻辑函数。主要包括xor(异或)、all、any、isnan、isinf、isfinite、
find等等。
(1)all函数:当向量的元素都为真时,函数all将返回变量1,否则返回变量0。对
于矩阵,函数all对列操作。当某列的元素都为真时,返回值为1。函数all对于矩阵的最
终运算结果为一个0-1行向量。
(2)any函数:当向量中至少有一个元素为真时,函数any将返回变量1;只有当向量
中的所有元素都为假时才返回变量0。和函数all一样,当运算数为矩阵时,函数any将逐
列运算,最后返回一个结果为0-1的行向量。
(3)函数isnan、isinf和isfinite:返回和运算数同维的数组。当运算数为NaN(非
数)时,函数isnan在返回数组的位置为1,否则返回0。当运算数的元素为inf(无穷大)
时,函数isinf在返回数组的相应位置为1。否则为0。当运算数的元素不为inf和NaN时,
函数isfinite在相应的位置返回1,否则返回0。下面的程序段给出了计算实例。
例2-6:
A=[0 1 5;2 NaN inf];B=[0 0 15;2 5 inf];
C=A./B
Warning: Divide by zero.
C = NaN Inf 0.3333
1.0000 NaN NaN
isfinite(C)
ans =0 0 1
1 0 0
isnan(C)
ans =1 0 0
0 1 1
isinf(C)
ans =0 1 0
0 0 0
(4)find函数:用于查找向量中的真元素的下标,返回由所有真元素下标构成的列
5
向量。对于数值向量,真元素即为非0元素。下面的程序段给出了它的用法。
例2-7:
A=magic(3) %生成三阶魔方矩阵。
A = 8 1 6
3 5 7
4 9 2
i=find(A>5) %查找A>5生成的0-1矩阵中的非0元素,并将非0元素在矩阵中的一维下标生成列向量i
i = 1
6
7
8
A(i)=1000 %将魔方矩阵中下标为i的元素赋值为1000。
A =1000 1 1000
3 5 1000
4 1000 2
2.2 程序控制语句
和其它高级语言一样,MATLAB 也提供了循环语句、条件转移语句等一些常用的控
制语句,而且与 C语言的控制语句格式很相似。
1、循环语句
MATLAB中的循环语句包括 for循环和 while循环两种类型。
z for循环
for循环的基本格式为:
for 循环变量=起始值:步长:终止值
循环体
end
步长的缺省值是 1。步长可以在正实数或负实数范围内任意指定,对于正数,循环变
量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值时,循环结束
z while循环
while循环的基本格式为:
while 表达式
循环体
end
其执行方式为:若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真,
若为假则跳出循环体,向下继续执行,否则继续执行循环体。
z break:从循环体中跳出,并使循环结束。
2、条件转移语句
条件转移语句有 if语句和 switch语句两种
6
z if-else-elseif语句
i. if格式:
if 逻辑表达式
执行语句
end
当逻辑表达式的值为真,则执行该结构中的执行语句内容,执行完后向下继续执行,
若逻辑表达式的值为假,跳过结构中的执行语句继续向下执行。
ii. if-else格式
if 逻辑表达式
执行语句 1
else
执行语句 2
end
如果逻辑表达式的值为真,则执行语句 1,然后跳过语句 2向下执行;若逻辑表达式
的值为假,则跳过执行语句 1而执行语句 2,然后向下执行。
iii. if-elseif格式
if 逻辑表达式 1
执行语句 1
elseif 逻辑表达式 2
执行语句 2
……
else 逻辑表达式 n
执行语句 n
else
执行语句 el
end
如果逻辑表达式的值为真,则执行语句 1,若逻辑表达式的值为假,则判断逻辑表达
式 2的值,若为真,则执行语句 2,否则向下执行。
z switch语句
switch语句的格式为:
switch 表达式(标量或字符串)
case 值 1
语句 1
case 值 2
语句 2
┅
case 值 n
语句 n
otherwise
7
语句 ow
end
其执行方式为:表达式的值和哪种情况(case)的值相同,就执行哪种情况中的语句,
如果都不同,则执行 otherwise中的语句。
2.3 矩阵运算
2.3.1 输入简单的矩阵
在 MATLAB 语言中不必描述矩阵的维数和类型,它们是由输入的格式和内容来决定
的。输入小矩阵最简单的方法是使用直接排列的形式,把矩阵的元素直接排列到方括号中。
每行内的元素间用空格(space)或逗号(,)分开,行与行的内容间用分号(;)隔开。
例如 2-8: A=[1 2 3; 4 5 6; 7 8 9] 或 A=[1,2,3; 4,5,6; 7,8,9]
都将得到输出结果:A= 1 2 3
4 5 6
7 8 9
大的矩阵可以分行输入,用回车键代替分号。这样的输入形式更接近于我们平时使用
矩阵的数学格式。如: A= [1 2 3
4 5 6
7 8 9]
矩阵的输入也可以通过建立 M 文件来完成,还可以通过函数的输出变量赋值建立。
向量和标量也可以看成是一种特殊的矩阵。
2.3.2 矩阵元素与下标引用
1.矩阵下标
在MATLAB中,矩阵元素的引用可以通过下标表示,通常有如下规则:
z 用两个下标来表示。在矩阵A中,第i行j列的元素用A(i,j)来表示。
z 用一个下标来表示。对于矩阵,由于MATLAB的基本运算都是对列操作的,矩阵
认为是按列优先排列的一个长的列向量,从而可用单下标引用。
例如:对于2×2的矩阵A,其中A(1)表示第一列的第一个元素,A(2)表示第一列
的第二个元素,A(3)表示第二列的第一个元素,A(4)表示第二列的第二个元素。
z 在下标的表达式里使用冒号表示矩阵的一部分。
例如:A(1:k,j)表示矩阵A的第j列的前k个元素。
A(:,j)表示矩阵A的第j列的所有元素。
由于有了冒号运算符,在MATLAB里编程变得特别简洁,例如求矩阵A的第j列元素之和,
其表达式为sum(A(:,j))。
z 下标引用从序号1开始。
2.矩阵的组合
在MATLAB里,矩阵的组合表示把小矩阵组合成大矩阵。矩阵的组合符号为中括号[]。
例2-9:A=[1,2;3,4],B=[A,A+100]
A =1 2
3 4
B =1 2 101 102
8
3 4 103 104
3.矩阵的抽取
用下标可以从大矩阵里面抽取某些元素组成小的矩阵,并使用()运算符。
例 2-10:
A=[1,2,3; 4,5,6;7,8,9];
C=[A;[10,11,12]],
D=C(1:3,:)
C=1 2 3
4 5 6
7 8 9
10 11 12
D=1 2 3
4 5 6
7 8 9
4.删除矩阵的行和列
我们把空的[]称为空矩阵,即矩阵大小为0×0。可以通过把矩阵的行或列赋值为空矩
阵来删除某行或某列。
例2-11:
X=[ ] %将一个0×0的矩阵赋给X
A(:,[2 4])=[ ] %则将A的第二列和第四列删除了
A(:,2)=[] %删除矩阵A的第二列
在MATLAB里不能用双下标来删除矩阵的某个元素,例如X(1,2)=[]将给出错误信息。
但可以用单下标来删除矩阵的某个或某些元素,MATLAB删除这些元素后,将剩下的元素按
列编成一个长的行向量。
例2-12:A=[1 2 3;4 5 6];
A(2:2:6)=[] %删除下标为2,4,6的三个元素
运行结果: A=1 2 3
2.3.3矩阵运算
1.矩阵的加减
矩阵地加减运算使用+、-运算符,能够相加减的矩阵满足以下两个条件之一:
(1)类型相同,即行数相等,且列数相等。
(2)其中一个为标量,此时的加减运算结果等于矩阵中每一个元素都和标量做加减运算。
例 2-13:x=[1 0 2];y=x-1
运算结果:y = 0 -1 1
2. 矩阵的乘积
矩阵的乘积运算使用*运算符,而且相乘的矩阵必须满足维数条件。
例 2-14:v=[3 1 4];u=[2;0;-1];
x=v*u %可求出内积。
x = 2
X=u*v %可求出外积。
X = 6 2 8
9
0 0 0
-3 -1 -4
3.矩阵的除法
MATLAB 定义的除法运算其意义相当于矩阵的求逆运算。更一般地,MATLAB 还定
义了矩阵的左除及右除。
·矩阵的左除:MATLAB 用“\”运算符号表示两个矩阵的左除,A\B 即由 Gauss 消
去法来获得线性方程 AX=B的解 X,即 X=A-1B。如果矩阵不是方阵,也可以求出 A\B,
这时将使用最小二乘法来求取 AX=B中的 X矩阵。
·矩阵的右除:MATLAB 用“/”表示两个矩阵的右除。X=B/A 是 X*A=B 的解,对
于非奇异方阵 A,B/A等效为 BA-1。
4.矩阵的转置
在MATLAB里,单引号表示复共轭转置,一个点加单引号".′"表示普通转置。
例 2-15: z=[1+2i 3+4i],
z′,z.′
运算结果:z=1+2i 3+4i
z′=1- 2i
3- 4i
z.′=1+2i
3+4i
5.矩阵的点运算
MATLAB中定义了一种特殊的运算,即点运算。两个矩阵之间的点运算是对该矩阵
对应元素的直接运算。例如 C=A.*B表示 A和 B矩阵的相应元素之间直接进行乘法运算,
然后将结果赋给 C 矩阵。注意,点乘积运算要求 A 和 B 矩阵的维数相同。这种点乘积又
称为 Hadamard乘积。常用的点运算包括:.*,./,.\,.’,.^。
例 2-16:对两个简单矩阵 A和 B
=
087
654
321
A ,
=
098
765
432
B
普通乘法运算与点乘运算结果分别为:
=
846954
519681
184236
AB ,
=
07256
423020
1262
*. BA
2.3.4 矩阵函数
1、 三角分解
矩阵最基本的分解是将一个方阵表示成两个基本三角阵的乘积,其中一个三角阵为上
三角阵,另一个为下三角阵。这种分解被称为"LU 分解"。利用这种分解,可以求矩阵的
逆,行列式的值,它也是解线性方程的基础,或者是方阵除法的基础。Matlab提供如下函
10
数:
[L,U]=lu(A) %求矩阵 A的 LU分解
X=inv(A) %求矩阵 A的逆矩阵
d=det(A) %求矩阵 A的行列式
2、特征值分解
对于求解 A矩阵的特征值和特征向量,其调用格式为:
d=eig(A);
[V,D]=eig(A);
[V,D]=eig(A,'nobalance')
其中 A 为方阵,且它的线性独立的特征向量个数等于矩阵 A 的阶数,d 为矩阵 A 的
特征值向量;D为 A阵的特征值对角阵,V为 A阵的全部右特征向量,且满足 A*V=V*D
的特征向量矩阵;当 A矩阵中有的元素小到和截断误差相当时,用 nobanlance选项。当 A
矩阵来自程序的中间计算结果时,一般用 nobalance选项来减少计算误差。
4、 矩阵的尺寸
为了判断矩阵的尺寸,Matlab提供了以下函数:
[m,n]=size(A) %返回矩阵的行数 m和列数 n
M=size(A) %在矩阵M中返回矩阵的行数、列数
len=length(A) %返回矩阵 A行数和列数中的最大值
5、 特殊矩阵的生成
在实际应用中经常要用到一些特殊矩阵,Matlab为我们提供了这些函数:
z 单位矩阵
eys(n) %生成 n维单位阵
eye(m,n) %生成 m×n的单位阵
eys([m,n]) %生成 m×n的单位阵
eye(size(A)) %生成与 A矩阵同样大小的单位矩阵
z 全 1矩阵
ones(n) ones(m,n) ones([m,n]) ones(size(A))
z 全零矩阵
zeros(n) zeros(m,n) zeros([m,n]) zeros(size(A))
z 随机矩阵
rand(n) rand(m,n) rand([m,n]) rand(size(A))
生成的随机矩阵的各个元素值在 0和 1之间。
z 魔术矩阵
magic(n)
魔术矩阵的所有行元素和、列元素和、对角线元素和均相等。
2.4 多项式
在MATLAB里,多项式用行向量表示。多项式 P(x)= an xn+ an-1xn-1+…+ a1x + a0。
11
其系数向量表示为:P=[an an-1 …a1 a0 ]。
2.4.1 多项式的创建
z 直接输入法
例如: P=[1,2,3,4]
z poly(A)
创建方阵 A的特征多项式
z poly(a)
如果 A为向量[bn bn-1…b1 b0],则创建 (x-b0 )( x-b1) … (x-bn-1 )(x- bn )生成的多项式的
系数向量。
2.4.2 多项式的常用函数
多项式的函数包括:
roots : %求多项式的根。
poly: %求矩阵的特征多项式。
polyval: %求多项式的自变量为某个特定值(标量)时的多项式的值。
polyvalm : %和 polyval作用相同,输入参数值也可为方阵。
当多项式的变量为矩阵时,其意义和标量差不多。例如,多项式 P(s)=x3-2x-4 ,
则 P(A)=A3-2A-4I,I为和 A同阶的单位阵。
例 2-17:p=[1 0 –2 -4];
r=roots(p)
r=2.00
-1.00+1.00i
-1.00-1.00i
A=[1.2 3 5 0.9;5 1.7 5 6;3 9 0 1;1 2 3 4];
poly(A) %求矩阵 A的特征多项式
ans =1.0000 -6.9000 77.2600 -86.1300 604.5500
polyval(ans,20) %求特征多项式中自变量为 20时的值
ans=7.2778e+004
Y=polyvalm(p,A) %把矩阵作为自变量代入到多项式中
Y=408.6880 454.0300 512.2400 494.7260
605.2500 777.3130 673.0500 695.5900
434.7200 863.9100 557.6000 506.2400
346.9400 445.7800 417.7000 412.7800
2.4.3 卷积和解卷积
卷积和解卷积是信号处理中常用的数学工具。向量的卷积和解卷积对应于多项式的乘
法和除法,其常用函数包括:
conv: %卷积函数 ,多项式乘法函数
deconv: %解卷积函数,多项式除法函数
polyder: %用于计算两个多项式的积、单个多项式和两个多项式的商的导数,其调
用格式为:
12
z Pd=polyder(P) %求多项式 P的导数
z Pm=polyder(P1,P1) %求多项式 P1和多项式 P2的乘积的导数
z [Q,D]=polyder(P1,P2) %求多项式 P1除以多项式 P2商的导数
例 2-18:
a=[1 2 3]; b=[4 5 6];
c=conv(a,b) %求多项式 a(s)和 b(s)的乘积
c =4 13 28 27 18
[q,r]=deconv(c,a);q %利用多项式除法求出多项式 b(s)
q = 4 5 6
q=polyder(c)
q = 16 39 56 27 %求多项式 c(s)的导数
2.4.4 多项式曲线的拟合
从最小二乘的意义上,polyfit函数将拟合出所给数据的多项式系数,其调用格式为:
p=polyfit(x,y,n)
其中,x和 y为已知数据的横坐标和纵坐标向量,n为多项式的次数。
例 2-19:已知五个数据点:[1,5.5],[2,43],[3,128],[4,290],[5,498],试画出这五个点拟合
的三次曲线。
解:运行下面的程序,并得到相应的拟合的曲线如图 2-1所示。
x=[1,2,3,4,5];y=[5.5,43,128,290,498];
p=polyfit(x,y,3)
p=-0.1250 30.9821 -58.8929 34.4000
x2=1:0.1:5;y2=polyval(p,x2);
plot(x,y,'o',x2,y2) ,grid on
图 2-1 多项式曲线拟合
2.5函数与 M文件
和其它高级语言一样,函数是MATLAB语言中最重要的组成部分,MATLAB提供的
各种工具箱中的M文件几乎都是以函数的形式给出的。
用 Matlab 语言编写的可以在 Matlab 环境中运行的程序称为 M 文件。M 文件用扩展
13
名.m结尾,可在命令行中执行,也可被其它程序调用,我们可以使用任何文本编辑器编辑
M文件。
M文件分为两种:命令文件和函数文件,它们有各自的特点。
2.5.1命令文件
命令文件没有输入参数也没有输出参数,只是一些Matlab命令和函数的组合。命令文
件可以操作工作空间的变量,也可以生成新的变量,但是当命令文件执行结束后新变量将
保存在工作空间中,不会被自动清除。
例 2-20:编写命令文件 test_com.m,用于求解小于 2000且为 2的整数次幂的正整数。
解:%test_com.m
F(1)=2;
k=1;
while F(k)<1000
F(k+1)= 2*F(k);
k=k+1;
end
F,k
为了能够在命令窗口执行 test_com命令,可以建立一个\MySample子目录,然后用命
令窗口的【File】|【Set Path】菜单将该目录加入的 Matlab的搜索目录中。这样就可以
直接在 Matlab命令窗口键入 test_com执行这个命令,其运行结果为:
F = Columns 1 through 6
2 4 8 16 32 64
Columns 7 through 10
128 256 512 1024
k =10
2.5.2函数文件
函数接收输入参数,返回输出参数。函数文件与程序文件类似也是以“.m”为扩展名
的文本文件,而程序文件与函数文件的主要区别在于,函数允许通过数值进行参数传递,
而且函数使用局部变量而不是全局变量操作。另外函数文件的第一行必须包括“function”
这个关键字。函数文件的文件名必须和函数定义的函数名称相同。
MATLAB的函数M文件通常由以下几个部分组成:
z 函数定义行
函数M文件的第一行用关键字“function”把M文件定义为一个函数,并指定它的名
字,并且与文件名必须相同,同时定义了函数的输入和输入参数。输入参数的定义用小括
号(),如果有多个输入参数则用逗号分隔;输出参数的定义用中括号[],如果有多个输出
参数则用逗号分隔。
z H1行
所谓 H1 行指帮助文本的第一行,它紧跟在定义行之后并以“%”符号开头,用于概
括说明函数名和函数的功能。在命令窗口用 lookfor命令时将显示所寻求函数的 H1行。
z 函数帮助文本
14
帮助文本指位于 H1 行之后函数体之前的说明文本,它同样以“%”符号开头,一般
用来比较详细地介绍函数的功能和用法。在命令窗口用 help命令时将显示函数的 H1行和
所有帮助文本。
z 函数体
是函数的主体部分,包括进行运行和赋值操作的所有 MATLAB 程序代码,其中可以
有流程控制、输入输出、计算、赋值、注释以及函数调用等操作。
z 注释
除了函数开始独立的帮助文本外,还可以在函数体中添加对语句的注释。注释必须以
“%”符号开头,MATLAB 在编译执行 M 文件时把每一行中“%”后面的全部内容作为
注释不进行编译。
2.5.3子函数
一个 M 文件中可以定义多个函数,其中第一个定义的函数称为主函数,主函数名必
须与 M 文件名相同,其它函数称为子函数。子函数只能被定义它的文件中的函数调用,
其它函数和文件不能调用。
2.5.4局部函数
把一些文件放在 private目录下,那么这些文件中定义的函数就是局部函数。局部函数
只能被其父母目录中的函数或文件调用,其它函数和文件无权调用。
2.5.5M文件的执行
当Matlab遇到一个新的名称(命令、函数、变量)时,按如下次序查找这个名称:
(1) 当前的工作空间;
(2) 子函数名称;
(3) 局部函数名称;
(4) set path指定的路径。
要想使自己编写的函数或命令能够在命令窗口自由的使用,一个比较好的处理方法是
建立一个目录,并把这个目录加到 Set Path指定的目录中,将自己编写的M文件都存放到
这个目录中。本书中的例子和附录中的程序都可以采用这种方法处理。
例 2-21:编写函数求∑ 。
=
n
k
k
1
!
解:function r=AddJc(n)
%AddJc.m 函数 AddJc(n)求 1到 n的阶乘的和
% n为输入参数,Jc为子函数
r=0; k=1;
while k<=n
r=r+Jc(k);
k=k+1;
end
%Jc(m)求解 m的阶乘,是文件内部函数(子函数)
function s=Jc(m)
15
s=1; k=1;
while k<=m
s=s*k;
k=k+1;
end
将 AddJc.m保存到工作目录中,在命令窗口可以直接使用 AddJc函数,但是不能使用
子函数 Jc。
2.6 数据的可视化
MATLAB不仅在数值计算方面很出色,而且在数据可视化方面也有上乘表现。通过对
图形线型、立面、色彩、渲染、光线、视角等的控制,可把数据的特征表现的淋漓尽致。
这里我们简单地介绍几种绘图命令。
2.6.1 图形窗口
MATLAB自动将图形画在图形窗口上,图形窗口相对于命令窗口是独立的窗口。图形
窗口的属性由系统和MATLAB共同控制。当MATLAB上没有图形窗口时,图形命令将新
建一个图形窗口;当MATLAB已经存在一个或多个图形窗口时,MATLAB一般指定最后
一个图形窗口作为当前图形命令的输出窗口。
Figure %建立一个新的图形窗口,并指定为当前窗口用于图形输出。
Subplot %把多个图形绘在一个图形窗口中。
subplot(m,n,I) %把图形窗口分成 m×n个小图形区域,并指定第 i个区域为图形的
绘制区域。图形区域的编排采用行优先,这和矩阵不同。
例2-22:运行下面的命令,可以在一个图形窗口中绘制四幅图形,如图2-2所示。
t=0:pi/20:2*pi;[x,y]=meshgrid(t);
subplot(2,2,1),
plot(sin(t),cos(t)),axis equal %axis equal表示纵横轴采用同一比例绘制
subplot(2,2,2),z=sin(2*x)+cos(2*y);
plot(t,z),axis([0 2*pi -2 2])
subplot(2,2,3),z=sin(x).^3.*cos(y);
plot(t,z),axis([0 2*pi -1 1])
subplot(2,2,4),z=(sin(x).^3)-(cos(y).^3);
plot(t,z), axis([0 2*pi -1 1]) %axis函数来指定每幅图的坐标轴显示的范围
16
图2-2 曲线图形
绘制图形时,用户不需指定图形窗口的背景颜色、轴的背景颜色、线条和文字等的颜
色。使用函数colordef可以从MATLAB给定的颜色
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
中选择,并可以修改颜色设置。
2.6.2 基本的绘图命令 plot
功能:plot是最基本的二维图形命令,它是以MATLAB的内部函数形式出现的。
MATLAB的其他二维函数中的绝大多数是以plot为基础构造的绘图命令。
格式: plot(y),ploy(x,y),plot(x1,y1,x2,y2,…)
说明:(1)plot(y):当y为向量时,则以y的元素为纵坐标,以相应元素下标为横坐标,
绘制连线图。如y为实矩阵,则按列绘制每列元素值相对其下标的连线图,图中的曲线数
等于矩阵的列数。若y为复矩阵,则分别以每列元素的实部和虚部为纵横坐标绘制多条连
线图。
(2)ploy(x,y):当y和x为同维向量,则以x为横坐标、y为纵坐标绘制连线图。若x
为向量,y是有一维和x同维的矩阵,则绘制多条不同颜色的连线图,曲线的个数等于矩阵
的另一维,x作为这些曲线的共同横坐标。若x为矩阵,y为向量,情况与上面相同,只是
都是以y为共同的纵坐标。若x和y为同维矩阵,则以x、y对应列元素为横纵坐标分别绘制
曲线,曲线条数等于矩阵的列数。若x和y为复数矩阵时,MATLAB将忽略虚数部分。
(3)plot(x1,y1,x2,y2,…):每对x、y必须符合plot(x,y)中的要求,不同对之间没
有影响,命令将对每一对x,y绘制曲线。
以上的三种格式中,输入参数x,y都可以是表达式,但表达式的结果应符合上述格式
要求。
例2-23:运行下面的程序,得到如图2-3,2-4所示图形
t=0:pi/100:2*pi;
y=cos(t);plot(t,y)
y2=cos(t-0.25);y3=sin(t-0.5);
figure,plot(t,y,t,y2,t,y3)
17
图2-3 y=cos(t)图形 图2-4y,y2,y3图形
Matlab提供了许多绘制二维图形的函数,它们的函数名称不同,但是函数的参数定义
和plot函数完全相同,表2-3给出了部分命令。
表2-3 部分绘制二维图形的命令
函数 轴的刻度方式
Loglog 纵横轴均采用对数坐标
Semilogx 纵轴采用线性坐标,横轴采用对数坐标
Semilogy 纵轴采用对数坐标,横轴采用线性坐标
plotyy 在图的左右两侧分别建立纵坐标轴
2.6.3 基本绘图控制
数据的可视化的一般步骤为:
①准备绘图需要的数据;
②指定绘图的窗口或者区域;
③调用基本绘图命令;
④选择线型、颜色、数据点形状;
⑤坐标轴控制,包括显示范围、刻度线、比例、网格线;
⑥标注控制,包括坐标轴名称、标题、相应文本等。
下面介绍图形绘制过程中的控制命令。
1. plot控制
功能:在调用函数plot时,可以指定线型,颜色,和数据点的图标。
格式:plot(x,y,‘color_linestyle_marker’)
说明:参数color_linestyle_marker 为一个字符串,由颜色、线型、数据点的图标组成,
其中颜色字符定义如表2-4所示,线型字符定义如表2-5所示,数据点标记字符定义如2-6
所示。
表2-4:颜色字符定义表
字符定义 颜色 字符定义 颜色
y yellow(黄) m magenta(洋红)
c cyan(青) r red(红)
g green(绿) b blue(兰)
w white(白) k black(黑)
表2-5:线型字符定义表
字符定义 线型 字符定义 线型
- 实线(默认) -- 虚线
18
: 点划线 -. 点连线
none 无线
表2-6:数据点标记字符定义表
字符定义 数据点标记 字符定义 颜色
+ 加号 ^ 反勾号
v 勾号 > 大于号
< 小于号 o 小圆圈
* 星号 . 小黑点
x 叉号 pentagram 五角星
square 小正方形 hexagram 六角星
diamond 菱形 none 无标记
例如:plot(x,y,’y:square’),字符串“y:square”表示用黄色点划线和正方形点标记
绘制曲线。
2. 坐标轴控制
a) axis([xmin,xmax,ymin,ymax])
指定轴的显示范围,四个输入参数分别为横轴显示的最小值和最大值、纵轴显的最小
值和最大值,可以用Inf和-Inf表示。
b) axis square
一般情况下,MATLAB给出的图形窗口不是正方形,所有显示的图形区域也不是正方
形。对应两轴的比例,一般也是不相等的。可以用此命令指定两轴的显示的长度相同。
c) axis tight
用于绘制指定数据的范围。“equal”和“tight”也可以同时选中。
d) axis equal
用于指定两轴的显示比例相同。
e) set(gca,’xtick’,[……]),set(gca,’ytick’,[……])
设置横轴(X轴)、纵轴(Y轴)的刻度线,第三个输入参数是一个刻度向量,并按照
等分升序原则排列。
3. 删格控制
控制图形窗口的栅格是否被显示。
grid on %显示栅格
grid off %隐藏栅格
4. 追加控制
控制绘图方式,即在当前窗口绘图时是否清除窗口上原来的的图形。
hold on %绘图时不清除绘图窗口中原有的图形
hold off %绘图时清除绘图窗口中原有的所有图形
5. 标注控制
在图形上加上适当的文字说明。
z xlable(‘string’,‘FontSize’,zize),ylable(‘string’, FontSize’,zize)
显示坐标轴的名称,string为坐标轴名称字符串,size为使用的字体尺寸。
19
z title(‘string’,‘FontSize’,size)
显示整个图形的标题,string为标题字符串,size为字体大小。
z text(x,y,‘stirng’)
在绘图窗口的坐标(x,y)处显示字符串string。
例2-24:运行下面的程序,并得到如图2-5所示图形。
x=-pi:0.02*pi:pi;
plot(x,cos(x));
xlabel('x=[-\pi \pi]','FontSize',16)
ylabel('cos(x)','FontSize',16)
title('Value of the Cosine')
text(3*pi/4,cos(3*pi/4),'\leftarrowcos(x)=-.707')
text(-pi/2,cos(pi/2),'\leftarrowcos(x)=0')
text(pi/4,cos(pi/4),'cos(x)=0.707\rightarrow','HorizontalAlignment','right')
-4 -3 -2 -1 0 1 2 3 4
-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
x=[-π π ]
co
s(
x)
Value of the Cosine
← cos(x)=-.707
← cos(x)=0
cos(x)=0.707→
图2-5 图形标注控制
小 结
本章简单介绍了MATLAB语言的基本使用方法,包括数据类型、编程语句、函数使用、
矩阵和多项式、二维图形的绘制等内容,至于数值计算和数据可视化方面的更为复杂的一
些函数,例如数据的三维的图形表现、图形的色彩、光线、视角等的控制,可以参考书后
的附录或者依靠帮助系统获得。
习 题
2.1编制函数,求二次方程的根并求出方程x2+53.99x-0.054=0的根
2.2已知矩阵A=[1,2,3;4,5,6;7,8,9],求A的逆矩阵、特征值、行列式的值。
2.3求矩阵A=[2,3,4;1,1,9;1,2,-6]的LU分解。
2.4在同一图形窗口分别绘制[0,4π]区间上的x1=10sint,x2=6|sin2t|t 曲线。
2.5编制程序,计算1+2+…+n<2000时的最大n值。
4. 分别用for和while循环结构编写程序,求出K= 。 ∑
=
63
0
2
i
i
20
21
MATLAB语言编程
2.1 数据类型和运算符
2.2 程序控制语句
2.3 矩阵运算
2.4 多项式
2.5函数与M文件
2.6 数据的可视化