MATLAB基础及其应用教程
上QQ阅读APP看书,第一时间看更新

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