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

3.2 矩阵运算

本节利用MATLAB实现矩阵的各类运算,其中包括矩阵与常数的四则运算、矩阵的转置、方阵的行列式、矩阵的逆和伪逆、矩阵和向量的范数、矩阵的秩、矩阵的迹、矩阵的指数和对数运算。

3.2.1 矩阵与常数的四则运算

矩阵与常数的四则运算即指矩阵各元素与常数之间的四则运算。在矩阵与常数进行除法运算时,常数通常只能作为除数。

3.16 矩阵与常数的四则运算。

>> 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
>> 100+A
ans =
101   101   101   101
102   102   102   102
103   103   103   103
104   104   104   104
>> 100-A
ans =
99    99    99    99
98    98    98    98
97    97    97    97
96    96    96    96
>> 100*A
ans =
100   100   100   100
200   200   200   200
300   300   300   300
400   400   400   400
>> A/2
ans =
0.5000    0.5000    0.5000    0.5000
1.0000    1.0000    1.0000    1.0000
1.5000    1.5000    1.5000    1.5000
2.0000    2.0000    2.0000    2.0000

3.2.2 矩阵的转置

在MATLAB中进行矩阵的转置运算非常简单,就是运用运算符“'”,此运算符的运算级别比加、减、乘、除等运算符的运算级别要高。

3.17 矩阵的转置运算。

>> A'
ans =
1     2     3     4
1     2     3     4
1     2     3     4
1     2     3     4

如果一个矩阵与其转置矩阵相等,则称其为对称矩阵;如果一个矩阵与其转置矩阵相加的结果为零矩阵,则称其为反对称矩阵。在MATLAB中判断对称矩阵和反对称矩阵的方法非常简单,如果isequal(A,A')返回1,则矩阵A为对称矩阵;如果isequal(A,-A')返回1,则矩阵A为反对称矩阵,如下面的程序。

>> B=[1 2 3;2 2 2;3 2 4]
B =
1     2     3
2     2     2
3     2     4
>> isequal(B,B')
ans =
1

3.2.3 方阵的行列式

对于方阵的行列式,手工计算是非常烦琐的,尤其是对于高阶方阵。而在MATLAB中,利用det(A)函数就可以非常简单地计算方阵的行列式的值。由线性代数的知识可以知道,如果方阵A的元素为整数,则计算结果也为整数。

3.18 方阵行列式的值。

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

利用det(X)=0来检验方阵是否为奇异矩阵,并不是任何时候都有效,在某些情况下会判断错误。而利用abs(det(X))<=tol来判断矩阵的奇异性也并不可靠,因为误差tol是很难确定的,通常利用条件函数cond(X)来判断是否为奇异矩阵或接近奇异的矩阵比较合理。

3.2.4 矩阵的逆和伪逆

对于方阵A,如果为非奇异矩阵,则存在逆矩阵inv(A),使得A*inv(A)=I。手工计算方阵的逆是非常烦琐的,而利用函数inv(A)则会非常方便地求出方阵的逆。函数inv(A)在求方阵的逆时采用高斯消元法。如果A不是方阵或A为奇异或接近奇异的矩阵,函数会给出警告信息,计算结果将都为Inf。在不是采用电气与电子工程师学会(Institute of Electrical and Electronics Engineers,IEEE)算法的计算机上,上述情况将会出错。

3.19 矩阵的逆运算。

>> A=[1 2 3;2 3 6;5 8 1]
A =
1     2     3
2     3     6
5     8     1
>> inv(A)
ans =
-3.2143    1.5714    0.2143
2.0000   -1.0000         0
0.0714    0.1429   -0.0714
>> B=[0 0 0;0 2 0;0 0 0]
B =
0     0     0
0     2     0
0     0     0
>> inv(B)
Warning: Matrix is singular to working precision.
ans =
Inf   Inf   Inf
Inf   Inf   Inf
Inf   Inf   Inf

对于奇异矩阵或非方阵的矩阵,并不存在逆矩阵,但可以用函数pinv(A)求其伪逆。其基本语法为 X=pinv(A),X=pinv(A,tol)。函数返回一个与矩阵A'大小相同的矩阵X,并且满足AXA=AXAX=X,且AXXA都是埃尔米特(Hermitian)矩阵。计算方法是基于奇异值分解svd(A),并且任何小于公差的奇异值都被看作零,其默认的公差为max(size(A))*norm(A)*EPS。如果A为非奇异矩阵,函数的计算结果与inv(A)相同,但却会耗费大量的计算时间,相比较而言,inv(A)花费更少的时间。在其他情况下,pinv(A)具有inv(A)的部分特性,但却不是与inv(A)完全等同,如下面的程序。

>> pinv(A)
ans =
-3.2143    1.5714    0.2143
2.0000   -1.0000   -0.0000
0.0714    0.1429   -0.0714

pinv(A)也可以用来求解线性方程AX=bX可以由pinv(A)*bAb分别解得,其中A可以不是方阵,可以为奇异矩阵。

3.20 利用矩阵的逆运算求解线性方程。

>> pinv(A)
ans =
-3.2143    1.5714    0.2143
2.0000   -1.0000   -0.0000
0.0714    0.1429   -0.0714
>> rank(A)
ans =
3
>> b=[0.3;0.4;0.5]
b =
0.3000
0.4000
0.5000
>> pinv(A)*b
ans =
-0.2286
0.2000
0.0429
>> A\b
ans =
-0.2286
0.2000
0.0429

3.2.5 矩阵和向量的范数

线性代数中,在对线性方程组进行直接求解时,由于实际的观测和测量误差以及计算过程中的舍入误差等的影响,所求得的数值解与精确解之间存在着一定的差异。为了了解所得解的精确程度,必须对解的误差进行评估,这就要用到范数。矩阵范数是矩阵元素的数量级大小的一种度量。在MATLAB中,利用函数norm()来求矩阵和向量的范数。矩阵和向量的范数如表3-2所示。

表3-2 矩阵和向量的范数

3.21 矩阵和向量的范数运算。

>> norm(A)
ans =
11.1792
>> norm(A,1)
ans =
13
>> norm(A,2)
ans =
11.1792
>> norm(A,inf)
ans =
14
>> norm(A,'fro')
ans =
12.3693

3.2.6 矩阵的秩

矩阵的秩用函数rank()来求得,该函数返回矩阵的行向量或列向量的不相关个数。

rank()函数返回矩阵A的奇异值中比误差tol大的奇异值的个数,tol的默认值为max(size(A))* norm(A)*eps。rank(A,tol)将指定误差tol

在MATLAB中,计算矩阵的秩的算法是以奇异值分解为基础的,用奇异值分解的方法来求解矩阵的秩会非常耗时,但却是最有效的方法之一。

3.22 矩阵的求秩运算。

>> s=svd(A)
s =
11.1792
5.2886
0.2368
>> tol=max(size(A))*s(1)*eps
tol =
7.4469e-015
>> r=sum(s>tol)
r =
3
>> B=[1 2 2;1 -1 1;2 3 4]
B =
1     2     2
1    -1     1
2     3     4
>> rank(B)
ans =
3
>> s=svd(B)
s =
6.1760
1.6875
0.0959

从矩阵B的奇异值可以看出,矩阵B的秩为3。

3.2.7 矩阵的迹

An阶方阵,如果数λn维非零列向量x使关系式Ax = λx成立,那么这样的数λ称为矩阵A的特征值。

矩阵的迹就是指矩阵对角线元素的和,它等于矩阵的特征值之和。函数trace(A)返回矩阵 A的迹,它等价于sum(diag(A)),这也是函数trace()的定义式。

3.23 矩阵的迹运算。

>> trace(A)
ans =
5

3.2.8 矩阵的指数和对数运算

矩阵的指数运算用expm()函数来实现,expm(X)=V*diag(exp(diag(D)))/V(其中X为已知矩阵,[V,D]=eig(X))。矩阵的对数运算用logm()函数来实现,L=logm(A),与矩阵的指数运算互为逆运算。

3.24 矩阵的指数和对数运算。

>> X=rand(4)
X =
0.4218    0.6557    0.6787    0.6555
0.9157    0.0357    0.7577    0.1712
0.7922    0.8491    0.7431    0.7060
0.9595    0.9340    0.3922    0.0318
>> Y=expm(X)
Y =
3.8965    2.6271    2.8171    2.0082
2.8209    2.7794    2.5435    1.4709
3.8951    3.3361    4.4792    2.4607
3.1593    2.6267    2.4720    2.4029
>> A=randn(4)
A =
-1.0689    0.3252   -0.1022   -0.8649
-0.8095   -0.7549   -0.2414   -0.0301
-2.9443    1.3703    0.3192   -0.1649
1.4384   -1.7115    0.3129    0.6277
>> B=logm(A)
B =
-0.5379 + 1.0982i   0.6777 + 0.8374i   0.1754 + 0.0952i  -0.6422 + 0.5274i
-0.2587 + 2.0370i   0.1904 + 1.5533i  -0.1976 + 0.1766i   0.4489 + 0.9783i
-3.3002 + 0.3816i   2.6070 + 0.2910i  -0.2133 + 0.0331i  -1.5967 + 0.1833i
2.5922 + 0.9516i  -1.8290 + 0.7256i   0.0274 + 0.0825i   1.1363 + 0.4570i