3.1 矩阵的表示
本节介绍在MATLAB中如何表示矩阵,其中包括数值矩阵的生成、矩阵的标识、矩阵的修改、矩阵元素的数据变换等。
3.1.1 数值矩阵的生成
生成矩阵有多种方法,通常使用的有以下4种方法。
● 在命令行窗口中直接输入矩阵。
● 在M文件中生成矩阵。
● 从外部的数据文件中导入矩阵。
● 通过函数生成特殊矩阵。
下面分别介绍这4种方法。
1.在命令行窗口中直接输入矩阵
在命令行窗口中直接输入矩阵是最简单、最常用的生成数值矩阵的方法之一。比较适合生成较小的简单矩阵,把矩阵的元素直接排列到方括号中,每行内的元素用空格或逗号分隔,行与行之间用分号分隔。
例3.1 在命令行窗口中直接输入矩阵。
>> A=[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4]
A =
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
这样,在MATLAB的工作空间中就生成了矩阵A
,以后则可以使用矩阵A
。
在输入矩阵的元素时,也可以分成几行输入,用按Enter键代替分号,即按照下列方式输入。
>> A=[1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4]
A =
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
● 输入矩阵时要以“[ ]”作为其标识符号,矩阵的所有元素必须都在“[]”内。
● 矩阵的同行元素之间用空格或逗号分隔,行与行之间用分号或按Enter键分隔。
● 矩阵的大小不需要预先定义。
● 若“[ ]”中无元素,则表示为空矩阵。
此外,矩阵元素也可以是表达式,MATLAB将自动计算结果。举例如下。
>> B=[12 7-sqrt(8) sin(2);23 5
*3 abs(-9)]
B =
12.0000 4.1716 0.9093
23.0000 15.0000 9.0000
在MATLAB中,矩阵元素还可以是复数,生成复数矩阵的方法和上面介绍的方法相同。
例3.2 复数矩阵的生成。
>> C=[1+2i 3 4
*sqrt(5);6 7/8 9-2i]
C =
1.0000 + 2.0000i 3.0000 8.9443
6.0000 0.8750 9.0000 - 2.0000i
也可以分别生成实部矩阵和虚部矩阵,再合起来构成复数矩阵。举例如下。
>> R=[1 2 3;4 5 6];
>> I=[1.1 2.2 3.3;4.4 5.5 6.6];
>> ri=R+i*I
ri =
1.0000 + 1.1000i 2.0000 + 2.2000i 3.0000 + 3.3000i
4.0000 + 4.4000i 5.0000 + 5.5000i 6.0000 + 6.6000i
这里的i
是单个数据,i
*I
表示一个数与一个矩阵相乘。
2.在M文件中生成矩阵
对于比较大且比较复杂的矩阵,可以为它专门建立一个M文件。下面通过一个简单的例子来说明如何利用M文件生成矩阵。
首先启动有关的文本编辑程序或MATLAB的M-file编辑器,并输入待建矩阵。M-file编辑器如图3-1所示。
图3-1 M-file编辑器
再把输入的内容存盘(设文件名为matrix.m)。
然后在MATLAB命令行窗口中输入matrix,即运行该M文件,就会自动生成矩阵A
,如下所示。
>> matrix
A =
1 2 3
4 5 6
7 8 9
3.从外部的数据文件中导入矩阵
MATLAB也允许用户调用在MATLAB环境之外定义的矩阵。可以利用任意的文本编辑器编辑所要使用的矩阵,矩阵元素之间以特定的分隔符分开,并按行列布置。
用户能够通过load命令将外部数据文件中的矩阵导入工作空间,外部数据文件的扩展名为.dat。
例3.3 利用文本编辑器创建数据文件test.dat,包含下列数据。
1 2 3 4
5 6 7 8
9 10 11 12
>> load test.dat
>> test
test =
1 2 3 4
5 6 7 8
9 10 11 12
4.通过函数生成特殊矩阵
对于经常用到的一些特殊的矩阵,如单元阵、全0阵、全1阵、随机阵、魔方阵、对角阵等,MATLAB 提供了相应的函数来快速生成这些矩阵。用户可以灵活运用这些函数和矩阵修改的一些操作,方便地生成一些特殊格式的矩阵,如利用对角阵和矩阵的左右翻转函数,可以生成矩阵元素在从左下角到右上角的对角线上的特殊矩阵。常用的生成矩阵的函数如表3-1所示,利用这些函数可以生成一些特殊矩阵。
表3-1 常用的生成矩阵的函数
表3-1中的大部分函数会返回double型的矩阵。但是,可以用ones()、zeros()和eye()函数很容易地生成任何数值类型的基本数组。
例3.4 常用的生成矩阵的函数介绍。
>> eye(3)
ans =
1 0 0
0 1 0
0 0 1
>> A=rand(3,4);
>> B=eye(size(A))
B =
1 0 0 0
0 1 0 0
0 0 1 0
>> ones(3,4)
ans =
1 1 1 1
1 1 1 1
1 1 1 1
>> zeros(5,4,'uint16')
ans =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
>> rand(3,4)
ans =
0.4854 0.4218 0.9595 0.8491
0.8003 0.9157 0.6557 0.9340
0.1419 0.7922 0.0357 0.6787
>> randn(3,4)
ans =
1.0347 0.2939 -1.1471 -2.9443
0.7269 -0.7873 -1.0689 1.4384
-0.3034 0.8884 -0.8095 0.3252
>>magic(4)
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
上述最后一个矩阵每一行、每一列和每条主对角线上的数加起来都等于34。
>> X=[31 56 27 -4 69];
>> Y=diag(X,-1)
Y =
0 0 0 0 0 0
31 0 0 0 0 0
0 56 0 0 0 0
0 0 27 0 0 0
0 0 0 -4 0 0
0 0 0 0 69 0
在MATLAB中,没有生成变量的必要,所有变量的存储空间都是在给变量赋值时自动分配的,然而频繁分配变量空间会大大降低语句的执行速度,因而应该尽量避免不必要的频繁的变量空间的分配。通常是先利用函数给变量分配好足够大小的空间,再对变量进行赋值。
3.1.2 矩阵的标识
矩阵元素的标识在对矩阵的单个或多个元素进行引用、赋值和修改中起着非常重要的作用,熟练掌握各种标识方式可以方便、灵活地对矩阵进行修改和引用。矩阵的标识主要有元素标识方式、向量标识方式和0-1向量标识方式,与find()函数连用还有矩阵标识方式。
1.元素标识方式A
(i
,j
)
整数i
和j
分别标识元素在矩阵A
中的行数和列数。
例3.5 元素标识方式。
>> A=[1 2 3;4 5 6;7 8 9];
>> A(2,3)
ans =
6
2.向量标识方式A
(vr
,vc
)
vr
和vc
分别为含有矩阵A
的行号和列号的单调向量,vr
和vc
中如一个是“:”,则表示取全部行(vr
为“:”)或全部列(vc
为“:”)。向量中的元素必须合法,即不会超出矩阵的维数。如A
(1:3,[3 4 5])表示取矩阵A
的第1、2、3行和第3、4、5列位置上的元素,A
(:,[2 3])表示取矩阵A
的第2列和第3列的所有元素。
例3.6 向量标识方式。
>> A(1,[1 3])
ans =
1 3
>> A(:,[1 3])
ans =
1 3
4 6
7 9
3.0-1向量标识方式A
(v1
,v2
),A
(:,v2
),A
(v1
:1
)
v1
和v2
是由元素0和1组成的长度分别等于矩阵A
的行维和列维的向量,其中的元素如果取1则表示取此相应位置上的行或列,若为0则不取。v1
和v2
都应该为逻辑向量,否则会出错。
例3.7 0-1向量标识方式。
>> l1=[0 1 0];
>> l2=[1 1 0];
>> l1=l1==1;
>> l2=l2==1;
>> A(l1,l2)
ans =
4 5
>> A(l1,:)
ans =
4 5 6
4.矩阵标识方式A(find(B))
矩阵B
是与矩阵A
大小相同的矩阵,如果B
的元素为非零值,则取当前位置的元素,否则不取。
例3.8 矩阵标识方式。
>> D=A;
>> D(find(eye(3)))=0
D =
0 2 3
4 0 6
7 8 0
>> D(find(~D))=inf
D =
Inf 2 3
4 Inf 6
7 8 Inf
3.1.3 矩阵的修改
矩阵的修改包括对矩阵进行扩充、矩阵元素的部分删除、矩阵元素的提取以及矩阵结构的变换等操作。这些操作在矩阵的构造和生成中具有非常重要的作用,灵活运用这些操作可以非常方便地生成所需的矩阵;对于矩阵元素较多的矩阵,避免了冗长的矩阵输入,节省了时间,并且不易出错。
1.矩阵的扩充
矩阵的扩充一般使用“[ ]”,用小的矩阵来生成大的矩阵,在构造过程中要保证生成的矩阵的各行和各列的元素个数相同,否则会出错。
例3.9 矩阵的扩充。
>> A=[1 1 1;1 1 1]
A =
1 1 1
1 1 1
>> B=zeros(1,3)
B =
0 0 0
>> C=[inf inf inf]
C =
Inf Inf Inf
>> D=[A;B;C]
D =
1 1 1
1 1 1
0 0 0
Inf Inf Inf
2.矩阵元素的部分删除
在MATLAB中,可以通过将矩阵的某行或某列赋值为空值而直接删除该行或该列。若删除行或列的部分元素则会出错。
例3.10 矩阵元素的部分删除。
>> D(:,2)=[]
D =
1 1
1 1
0 0
Inf Inf
>> D(3,2)=[]
Subscripted assignment dimension mismatch.
3.矩阵元素的提取
(1)diag(A
,k
):提取矩阵A
的第k
对角线的元素组成列向量,若k
=0,则将提取主对角线的元素。
(2)diag(A
):提取矩阵A
的主对角线的元素组成列向量。
(3)tril(A
,k
):提取矩阵的下三角部分。
(4)triu(A
,k
):提取矩阵的上三角部分。
例3.11 矩阵元素的修改。
>> B=ones(3)
B =
1 1 1
1 1 1
1 1 1
>> tril(B,-1)
ans =
0 0 0
1 0 0
1 1 0
>> triu(B,1)
ans =
0 1 1
0 0 1
0 0 0
4.矩阵结构的变换
(1)reshape(A
,n1
,n2
,n3
,…):返回以矩阵A
的元素作为元素的n
1
×n
2
×n
3
×…维矩阵,A
的元素个数等于prod(n1
,n2
,n3
,…)。
(2)rot90(A
):将矩阵A
逆时针旋转90°。
rot90(A
,k
):将矩阵A
逆时针旋转k
×90°,k
为整数。
(3)fliplr(A
):将矩阵A
左右翻转。
(4)flipud(A
):将矩阵A
上下翻转。
例3.12 矩阵结构的变换。
>> a=[1 1 1; 1 1 1;1 1 1]
a =
1 1 1
1 1 1
1 1 1
>> reshape(a,1,9)
ans =
1 1 1 1 1 1 1 1 1
>> b=[1 2 3 4;5 6 7 8]
b =
1 2 3 4
5 6 7 8
>> rot90(b)
ans =
4 8
3 7
2 6
1 5
>> rot90(b,2)
ans =
8 7 6 5
4 3 2 1
>> fliplr(b)
ans =
4 3 2 1
8 7 6 5
>> flipud(b)
ans =
5 6 7 8
1 2 3 4
3.1.4 矩阵元素的数据变换
1.对由小数构成的矩阵A
取整数
(1)floor(A
):表示将矩阵A
中的元素按−∞方向取整,即取不足整数。
(2)ceil(A
):表示将矩阵A
中的元素按+∞方向取整,即取过剩整数。
(3)round(A
):表示将矩阵A
中的元素按最近的整数取整,即四舍五入取整。
(4)fix(A
):表示将矩阵A
中的元素按离0近的方向取整。
例3.13 矩阵取整函数的用法。
>> A=2
*rand(3)
A =
1.6294 1.8268 0.5570
1.8116 1.2647 1.0938
0.2540 0.1951 1.9150
>> B1=floor(A)
B1 =
1 1 0
1 1 1
0 0 1
>> B2=ceil(A)
B2 =
2 2 1
2 2 2
1 1 2
>> B3=round(A)
B3 =
2 2 1
2 1 1
0 0 2
>> B4=fix(A)
B4 =
1 1 0
1 1 1
0 0 1
2.矩阵的有理数形式
[n
,d
]=rat(A
):表示将矩阵A
表示为两个整数矩阵相除,即A
=n
./d
。
例3.14 矩阵的有理数形式。
>> [n,d]=rat(A)
n =
321 833 215
125 2943 2613
16 119 676
d =
197 456 386
69 2327 2389
63 610 353
3.矩阵元素的余数
B
=rem(A
,x
):表示矩阵A
除以模数x
后的余数。若x
=0,则定义rem(A
,0)=NaN;若x
≠0,则整数部分由fix(A.
/x
)表示,余数部分由C
=A
-x.
*fix(A.
/x
)表示,允许模数x
为小数。
例3.15 矩阵元素的余数。
>> rem(A,2)
ans =
1.6294 1.8268 0.5570
1.8116 1.2647 1.0938
0.2540 0.1951 1.9150