2.2 基本矩阵操作
MATLAB R2012a超级学习手册
MATLAB中最基本的数据结构是二维的矩阵。二维的矩阵可以方便地存储和访问大量数据。每个矩阵的单元可以是数值类型、逻辑类型、字符类型或者其他任何的MATLAB数据类型。
2.2.1 矩阵的构造
1.简单矩阵构造
最简单的构造矩阵方法是采用矩阵构造符[],构造一行的矩阵可以把矩阵元素放在矩阵构造符[]中,并以空格或者逗号来隔开它们,其代码设置如下。
row=[E1,E2,...,Em]或者row=[E1E2...Em]
如果矩阵是多行的,行与行之间用分号隔开,其代码设置如下。
A=[row1;row2;...;rown]
例如,一个4×4的矩阵可以用如下语句得到。
>>A=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16]
上述语句得到矩阵A如下。
A=
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2.特殊矩阵构造
MATLAB还提供一些函数用来构造一些特殊的矩阵,这些函数如表2-4所示。
例如,要产生一个3×3的魔方矩阵,实现方法如下。
>>A=magic(3)
由上述语句得到如下矩阵。
A=
8 1 6
3 5 7
4 9 2
3.向量的构造
向量在构造矩阵和对矩阵进行索引时是很有用的,因此MATLAB提供了专门用于产生向量的运算符“:”。
冒号可以用来构造步长为1的递增向量,其格式如下。
a:b
上式可用于产生如下所示的从a~b的以步长为1递增向量。
>>A=-2.5:2.5
由上述语句生成的结果如下。
A=
-2.5000 -1.5000 -0.5000 0.5000 1.5000 2.5000
MATLAB也支持产生任意步长的向量,步长甚至可以是负数。例如以下代码产生的步长就为负数。
>>A=2:-0.5:-1
上述语句生成的结果如下。
A=
2.0000 1.5000 1.0000 0.50000 -0.5000 -1.0000
2.2.2 矩阵大小的改变
1.矩阵的合并
矩阵的合并就是把两个或者两个以上的矩阵数据连接起来得到一个新的矩阵。前面介绍的矩阵构造符[]不仅可用于构造矩阵,同时还可以作为一个矩阵合并操作符。表达式C=[AB]在水平方向合并矩阵A和B,而表达式C=[A;B]在竖直方向合并矩阵A和B。
例如,输入如下代码。
>>A=eye(2,4);
>>B=ones(2,4);
>>C=[A;B]
由上述语句得到结果代码如下。
C=
1 0 0 0
0 1 0 0
1 1 1 1
1 1 1 1
除了使用矩阵合并符[]来合并矩阵外,还可以使用矩阵合并函数来合并函数。这些矩阵合并函数的函数描述和基本调用格式如表2-5所示。
例如下面的代码可进行合并操作。
>>A=ones(3);
>>B=eye(2);
>>C=blkdiag(A,B)
由上述语句得到输出代码如下。
C=
1 1 1 0 0
1 1 1 0 0
1 1 1 0 0
0 0 0 1 0
0 0 0 0 1
2.矩阵行列的删除
要删除矩阵的某一行或者是某一列,只要把该行或者该列赋予一个空矩阵[]即可。例如一个魔方矩阵A,代码设置如下。
>>A=magic(3)
上述语句得到矩阵A如下。
A=
8 1 6
3 5 7
4 9 2
如果想删除矩阵的第3行,则可以用如下语句。
>>A(3,:)=[]
由上述语句得到新的矩阵A如下。
A=
8 1 6
3 5 7
2.2.3 矩阵下标引用
1.矩阵下标访问单个矩阵元素
若A是一个2维矩阵,可以用A(i,j)来表示第i行第j列的元素。例如,假设A=magic(4),那么A(2,4)代表第2行第4列的数字。代码设置如下。
>>A=magic(4)
>>a=A(2,4)
由上述语句得到输出代码如下。
A=
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
a=
8
也可以通过下标来改变矩阵的值,代码设置如下。
>>A(2,4)=100
由上述语句得到新的矩阵A如下。
A =
16 2 3 13
5 11 10 100
9 7 6 12
4 14 15 1
2.线性引用矩阵元素
在MATLAB中可以通过单下标来引用矩阵元素,引用格式为A(k)。通常这样的引用被用于行向量或列向量。但是这样的引用也可以用于二维矩阵。
MATLAB存储矩阵元素时并不是按照其命令行输出矩阵的格式来存储矩阵的。实际上,矩阵可以看成是按列优先排列的一个长列向量格式来存储的。例如下面的代码。
>>A = [1 4 7;2 5 8; 3 6 9]
由上述语句得到如下输出语句。
A =
1 4 7
2 5 8
3 6 9
矩阵A实际上在内存中是被存储成以1、2、3、4、5、6、7、8、9排列的一个列向量。A矩阵的第1行第2列,也就是值为4的元素实际上在存储空间是第4个元素。要访问这个元素,就可以用A(1,2)格式,也可以用A(4)格式。后者也就是线性引用矩阵元素方法。
3.引用矩阵元素方式转换
如果有矩阵的下标,但是却想用线性引用矩阵元素方法来访问矩阵,就可以用sub2ind()函数来得到线性引用的下标。例如下面的代码可实现此功能。
>>A = [1 4 7;2 5 8; 3 6 9];
linearindex_A=sub2ind(size(A),1,2)
由上述语句得到输出代码如下。
linearindex_A=
4
反之,如果想从线性引用的下标得到矩阵的下标可以用函数ind2sub(),例如下面的代码。
>> [A_rowA_col]=ind2sub(size(A),4)
由上述语句得到输出代码如下。
A_row=
1
A_col=
2
2.2.4 矩阵信息的获取
1.矩阵尺寸信息
矩阵尺寸函数可以得到矩阵的形状和大小信息。这些函数如表2-6所示。
下面例子用于表明如何使用矩阵尺寸信息获取函数。
矩阵A为一个随机阵,代码如下。
>>A=rand(3,4)
上述语句得到矩阵A如下。
A =
0.9649 0.9572 0.1419 0.7922
0.1576 0.4854 0.4218 0.9595
0.9706 0.8003 0.9157 0.6557
求矩阵A的最长方向的长度,代码如下。
>>n=length(A)
上述语句得到的结果如下。
n=
4
2.矩阵元素的数据类型和结构
获得矩阵元素的数据类型信息的函数如表2-7所示。
测试矩阵是否为某一种数据结构的函数如表2-8所示。
2.2.5 矩阵结构的改变
可以改变矩阵结构的函数如表2-9所示。
下面以一些例子来说明这些函数的用法,设矩阵A形式如下,并输入代码如下。
>>A = [1 4 7;2 5 8; 3 6 9];
得到代码如下。
A =
1 4 7
2 5 8
3 6 9
例如,需要矩阵A的转秩,可以用下面语句来实现。
>>B=transpose(A)
得到代码如下。
B =
1 2 3
4 5 6
7 8 9
例如,需要把矩阵以水平方向为轴做镜像,可以用下面语句来实现。
>>B=flipud(A)
得到代码如下。
B =
3 6 9
2 5 8
1 4 7
2.2.6 稀疏矩阵
在MATLAB中可以用两种方式来存储矩阵,即满矩阵存储方式和稀疏矩阵存储方式,简称满矩阵和稀疏矩阵。
在很多情况下,一个矩阵只有少数的元素是非零的,而前面的章节中介绍的矩阵对于零值和非零值是花费同样空间来存储的。
因此,这种存储方式会浪费很多存储空间,有时还会减慢计算的速度。这种存储方式称为满矩阵存储方式。而稀疏矩阵在MATLAB内部是以非零元素和非零元素的行列指标数组来表示的。
说明:
稀疏矩阵提供了一种针对矩阵元素大多数都是零值矩阵的有效存储方式。
读者可以创建双精度类型、复数类型和逻辑类型的稀疏矩阵,所有MATLAB自带的数学函数、逻辑函数和引用操作均可以使用在稀疏矩阵上。
注意:
稀疏矩阵不能自动生成,定义在满矩阵的运算只能生成满矩阵,而不论多少个元素为零。
但是,一旦以稀疏矩阵来存储,那么稀疏矩阵的存储方式就会传播下去。即定义在稀疏矩阵上的运算生成稀疏矩阵,定义在满矩阵上的运算生成满矩阵。
1.稀疏矩阵的创建和查看
MATLAB提供转换函数可以从满矩阵得到稀疏矩阵,即sparse()函数,其调用格式为S=sparse(A),其中A为满矩阵。例如A=[0 0 5 0;8 0 0 0;0 1 0 0;0 0 0 7],代码如下。
>>A=[0 0 5 0;8 0 0 0;0 1 0 0;0 0 0 7];
A =
0 0 5 0
8 0 0 0
0 1 0 0
0 0 0 7
B=sparse(A)
由上述语句得到输出代码如下。
B =
(2,1) 8
(3,2) 1
(1,3) 5
(4,4) 7
MATLAB还提供一些函数用于创建特殊的稀疏矩阵。这些函数如表2-10所示。
MATLAB还提供一些函数,用于得到稀疏矩阵的定量信息和图形化信息。这些函数包括得到稀疏矩阵非零值信息和图形化稀疏矩阵。
查看稀疏矩阵非零值信息的函数如表2-11所示。
2.稀疏矩阵的运算规则
在MATLAB系统中的各种命令都可以用于稀疏矩阵的运算。有稀疏矩阵参加运算时,所得到的结果将遵循以下的规则。
把矩阵变为标量或者定长向量的函数总是给出满矩阵。
把标量或者定长向量变换到矩阵的函数(zeros()、ones()、eye()、rand()等)总是给出满矩阵。而能给出稀疏矩阵结果的相应的函数有speye()和sprand()等。
从矩阵到矩阵或者向量的变换函数将以原矩阵的形式出现,即定义在稀疏矩阵上的运算生成稀疏矩阵,定义在满矩阵上的运算生成满矩阵。例如chol(S)、max(S)和sum(S)等函数。
两个矩阵运算符(如+、−、*、、|)操作后的结果一般都是满矩阵,除非参加运算的矩阵都是稀疏矩阵,或者操作本身(如.*,&)保留矩阵的稀疏性。
参与的矩阵扩展(如[AB;CD])的子矩阵中,只要有一个是稀疏的,那么所得的结果也是稀疏的。
在矩阵引用中,将仍以原矩阵形式给出结果。若S矩阵是稀疏的,而Y矩阵是全元素的,不管I、J是标量还是向量,那么“右引用”Y=S(I,J)产生稀疏矩阵,而“左引用”S(I,J)=Y产生满矩阵。