2.3.4 矩阵的代数运算
矩阵的代数运算应包括线性代数中讨论的诸多方面,限于篇幅,本节仅就一些常用的代数运算在MATLAB中的实现给予描述。
本节所描述的代数运算包括求矩阵行列式的值、矩阵的加减乘除、矩阵的求逆、求矩阵的秩、求矩阵的特征值与特征向量、矩阵的乘方与开方等。这些运算在MATLAB中有些是由运算符完成的,但更多的运算是由函数实现的。
1.求矩阵行列式的值
求矩阵行列式的值由函数det(A)实现。
【例2.24】 求给定矩阵的行列式值。
>> A=[3 2 4;1-1 5;2 –13], D1=det(A) A = 3 2 4 1 -1 5 2 -1 3 D1 = 24 >> B=ones(3), D2=det(B), C=pascal(4), D3=det(C) B = 1 1 1 1 1 1 1 1 1 D2 = 0 C = 1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20 D3 = 1
2.矩阵加减、数乘与乘法
矩阵的加减法、数乘和乘法可用表2-2介绍的运算符来实现。
【例2.25】 已知矩阵
求A+B,2A,2A-3B, AB。
>>A=[1 3;2 –1]; B=[3 0;1 2]; >>A+B ans = 4 3 3 1 >> 2*A ans = 2 6 4 -2 >> 2*A-3*B ans = -7 6 1 -8 >> A*B ans = 6 6 5 -2
因为矩阵加减运算的规则是对应元素相加减,所以参与加减运算的矩阵必须是同阶矩阵。而数与矩阵的加减乘除的规则一目了然,但矩阵相乘有定义的前提是两矩阵内阶相等。
3.求矩阵的逆矩阵
在MATLAB中,求一个 n 阶方阵的逆矩阵远比线性代数中介绍的方法来得简单,只需调用函数inv(A)即可实现。
【例2.26】 求矩阵A的逆矩阵。
>> A=[1 0 1;2 1 2;0 4 6] A = 1 0 1 2 1 2 0 4 6 >> format rat; A1=inv(A) A1 = -1/3 2/3 -1/6 -2 1 0 4/3 -2/3 1/6
4.矩阵的除法
有了矩阵求逆运算后,线性代数中不再需要定义矩阵的除法运算。但为与其他高级语言中的标量运算保持一致,MATLAB保留了除法运算,并规定了矩阵的除法运算法则,又因照顾到解不同线性代数方程组的需要,提出了左除和右除的概念。
左除即A\B=inv(A)*B,右除即A/B=A*inv(B),相关运算符的定义参见2.1.5节表2-2的说明。
【例2.27】 求下列线性方程组的解
解:此方程可列成两组不同的矩阵方程形式。
一是,设X=[x1; x2; x3; x4]为列向量,矩阵A= [1 4-7 6;0 2 1 1;0 1 1 3;1 0 1-1], B=[0; -8; -2;1]为列向量,则方程形式为AX=B,其求解过程用左除:
>>A=[1 4-7 6;0 2 1 1;0 1 1 3;1 0 1-1], B=[0; -8; -2;1], x=A\B A = 1 4 -7 6 0 2 1 1 0 1 1 3 1 0 1 -1 B = 0 -8 -2 1 x = 3.0000 -4.0000 -1.0000 1.0000 >> inv(A)*B ans = 3.0000 -4.0000 -1.0000 1.0000
由此可见,A\B的确与inv(A)*B相等。
二是,设X=[x1x2x3x4]为行向量,矩阵A=[1 0 0 1;4 2 1 0; -7 1 1 1;6 1 3-1],矩阵B=[0-8-21]为行向量,则方程形式为XA=B,其求解过程用右除:
>>A=[1 0 0 1;4 2 1 0; -7 1 1 1;6 1 3-1], B=[0-8-2 1], x=B/A A = 1 0 0 1 4 2 1 0 -7 1 1 1 6 1 3 -1 B = 0 -8 -2 1 x = 3.0000 -4.0000 -1.0000 1.0000 >> B*inv(A) ans = 3.0000 -4.0000 -1.0000 1.0000
由此可见,A/B的确与B*inv(A)相等。
本例用左右除法两种方案求解了同一线性方程组的解,计算结果证明两种除法都是准确可用的,区别只在于方程的书写形式不同而已。
另需说明一点,本例所求的是一个恰定方程组的解,对超定和欠定方程,MATLAB矩阵除法同样能给出其解,限于篇幅,在此不做讨论。
5.求矩阵的秩
矩阵的秩是线性代数中一个重要的概念,它描述了矩阵的一个数值特征。在MATLAB中求秩运算是由函数rank(A)完成。
【例2.28】 求矩阵的秩。
>> B=[1 3-9 3;0 1-3 4; -2-3 9 6], rb=rank(B) B = 1 3 -9 3 0 1 -3 4 -2 -3 9 6 rb = 2
6.求矩阵的特征值与特征向量
矩阵的特征值与特征向量是在最优控制、经济管理等许多领域都会用到的重要数学概念。在MATLAB中,求矩阵 A 的特征值和特征向量的数值解,有两个函数可用:一是[X, λ]=eig(A),另一是[X, λ]=eigs(A)。但后者因采用迭代法求解,在规模上最多只给出6个特征值和特征向量。
【例2.29】 求矩阵A的特征值和特征向量。
>> A=[1-3 3;3-5 3;6-6 4], [X, Lamda]=eig(A) A = 1 -3 3 3 -5 3 6 -6 4 X = 0.4082 0.4082 -0.1203 0.4082 -0.4082 -0.7595 0.8165 -0.8165 -0.6393 Lamda = 4.0000 0 0 0 -2.0000 0 0 0 -2.0000
Lamda用矩阵对角线方式给出了矩阵 A 的特征值为λ1=4, λ2=λ3=-2。而与这些特征值相应的特征向量则由X的各列来代表,X的第1列是λ1的特征向量,第2列是λ2的,其余类推。必须说明,矩阵A的某个特征值对应的特征向量不是有限的,更不是唯一的,而是无穷的。所以,例中结果只是一个代表向量而已。有关知识请参阅线性代数教材。
7.矩阵的乘幂与开方
在MATLAB中,矩阵的乘幂运算与线性代数相比已经做了扩充,在线性代数中,一个矩阵A自己连乘数遍,就构成了矩阵的乘方,例如A3。但3A这种形式在线性代数中就没有明确定义了,而MATLAB则承认其合法性并可进行运算。矩阵的乘方有自己的运算符(^)。
同样地,矩阵的开方运算也是MATLAB自己定义的,它的依据在于开方所得矩阵相乘正好等于被开方的矩阵。矩阵的开方运算由函数sqrtm(A)实现。
【例2.30】 矩阵的乘幂与开方运算。
>> A=[1-3 3;3-5 3;6-6 4]; >> A^3 ans = 28 -36 36 36 -44 36 72 -72 64 >> A^1.2 ans = 1.7097-0.6752i -3.5683-0.6752i 3.5683 + 0.6752i 3.5683 + 0.6752i -5.4270-2.0256i 3.5683 + 0.6752i 7.1367 + 1.3504i -7.1367-1.3504i 5.2780-0.0000i >> 3^A ans = 40.5556 -40.4444 40.4444 40.4444 -40.3333 40.4444 80.8889 -80.8889 81.0000 >> A1=sqrtm(A) A1 = 1.0000 + 0.7071i -1.0000 + 0.7071i 1.0000-0.7071i 1.0000-0.7071i -1.0000 + 2.1213i 1.0000-0.7071i 2.0000-1.4142i -2.0000 + 1.4142i 2.0000-0.0000i >> A1^2 ans = 1.0000-0.0000i -3.0000 + 0.0000i 3.0000 3.0000-0.0000i -5.0000 + 0.0000i 3.0000-0.0000i 6.0000-0.0000i -6.0000 + 0.0000i 4.0000-0.0000i
本例中,矩阵A的非整数次幂是依据其特征值和特征向量进行运算的,如果用X表示特征向量,Lamda表特征值,具体计算式是A^p=Lamda*X.^p/Lamda。
需要强调指出的是,矩阵的乘方和开方运算是以矩阵作为一个整体的运算,而不是针对矩阵每个元素施行的。强调的目的在于与2.4.3节数组的乘幂和开方运算相区别。
8.矩阵的指数与对数
矩阵的指数与对数运算也是以矩阵为整体而非针对元素的运算。和标量运算一样,矩阵的指数与对数运算也是一对互逆的运算,也就是说,矩阵A的指数运算可以用对数去验证,反之亦然。
矩阵指数运算的函数有多个,例如expm( )、expm1( )、expm2( )和expm3( )等,其中最常用的是expm(A);而对数运算函数则是logm(A)。
【例2.31】 矩阵的指数与对数运算。
>> A=[1-1 1;2-4 1;1-5 3] A = 1 -1 1 2 -4 1 1 -5 3 >> Ae=expm(A) Ae = 1.3719 -3.7025 4.4810 0.3987 -2.3495 2.9241 -2.5254 -7.6138 9.5555 >> Ael=logm(Ae) Ael = 1.0000 -1.0000 1.0000 2.0000 -4.0000 1.0000 1.0000 -5.0000 3.0000
9.矩阵转置
在MATLAB中,矩阵的转置被分成共轭转置和非共轭转置两大类。共轭转置有专门的运算符列在表2-2中。但就一般实矩阵而言,共轭转置与非共轭转置的效果没有区别,复矩阵则在转置的同时实现共轭。
单纯的转置运算可以用函数transpose(Z)实现,不论实矩阵还是复矩阵都只实现转置而不做共轭变换。具体情况见下例。
【例2.32】 矩阵转置运算。
>> a=1:9 a = 1 2 3 4 5 6 7 8 9 >> A=reshape(a,3,3) A = 1 4 7 2 5 8 3 6 9 >> B=A' B = 1 2 3 4 5 6 7 8 9 >> Z=A+i*B Z = 1.0000 + 1.0000i 4.0000 + 2.0000i 7.0000 + 3.0000i 2.0000 + 4.0000i 5.0000 + 5.0000i 8.0000 + 6.0000i 3.0000 + 7.0000i 6.0000 + 8.0000i 9.0000 + 9.0000i >> Z' ans = 1.0000-1.0000i 2.0000-4.0000i 3.0000-7.0000i 4.0000-2.0000i 5.0000-5.0000i 6.0000-8.0000i 7.0000-3.0000i 8.0000-6.0000i 9.0000-9.0000i >> transpose(A) ans = 1 2 3 4 5 6 7 8 9 >> transpose(Z) ans = 1.0000 + 1.0000i 2.0000 + 4.0000i 3.0000 + 7.0000i 4.0000 + 2.0000i 5.0000 + 5.0000i 6.0000 + 8.0000i 7.0000 + 3.0000i 8.0000 + 6.0000i 9.0000 + 9.0000i
10.矩阵的提取与翻转
矩阵的提取和翻转是针对矩阵的常见操作。在MATLAB中,这些操作都由函数实现,这些函数如表2-10所示。
表2-10 矩阵结构形式提取与翻转函数
下面举例说明他们的应用。
【例2.33】 矩阵提取与翻转。
>> a=linspace(1,23,12) a = 1 3 5 7 9 11 13 15 17 19 21 23 >> A=reshape(a,4,3)' A = 1 3 5 7 9 11 13 15 17 19 21 23 >> fliplr(A) ans = 7 5 3 1 15 13 11 9 23 21 19 17 >> flipdim(A,2) ans = 7 5 3 1 15 13 11 9 23 21 19 17 >> flipdim(A,1) ans = 17 19 21 23 9 11 13 15 1 3 5 7 >> triu(A) ans = 1 3 5 7 0 11 13 15 0 0 21 23 >> tril(A) ans = 1 0 0 0 9 11 0 0 17 19 21 0 >> diag(A) ans =1 11 21