MATLAB完全自学教程
上QQ阅读APP看书,第一时间看更新

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)

整数ij分别标识元素在矩阵A中的行数和列数。

3.5 元素标识方式。

>> A=[1 2 3;4 5 6;7 8 9];
>> A(2,3)
ans =
6

2.向量标识方式A(vr,vc)

vrvc分别为含有矩阵A的行号和列号的单调向量,vrvc中如一个是“:”,则表示取全部行(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)

v1v2是由元素0和1组成的长度分别等于矩阵A的行维和列维的向量,其中的元素如果取1则表示取此相应位置上的行或列,若为0则不取。v1v2都应该为逻辑向量,否则会出错。

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的元素作为元素的n1×n2×n3×…维矩阵,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