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
=A
、XAX
=X
,且AX
和XA
都是埃尔米特(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
=b
,X
可以由pinv(A
)*b
和A
、b
分别解得,其中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 矩阵的迹
设A是n阶方阵,如果数λ和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