6.4 矩阵运算

本节将介绍MATLAB中与矩阵运算相关的内容,包括矩阵分析、矩阵分解、特征值和特征向量求解等。

6.4.1 矩阵分析

MATLAB提供的矩阵分析函数(常见函数)如表6.2所示。

表6.2 矩阵分析函数

有关的数学知识可参考相关的线性代数书籍,这里不再赘述。下面简单介绍这些函数的使用方法。

1.向量和矩阵的范数运算

MATLAB提供norm函数来求向量和矩阵的范数。该函数求解向量的范数的调用格式如下:

    N=norm(x, p):对任意大于等于1的p值,返回向量x的p阶范数;
    N=norm(x, inf):返回向量的正无限阶范数,相当于N=max(abs(x));
    N=norm(x, -inf):返回向量的负无限阶阶范数,相当于N=min(abs(x))。

求矩阵范数调用格式如下:

    N=norm(A):计算矩阵的2 阶范数,也就是最大奇异值;
    N=norm(A, p):根据参数p的值不同,求不同阶的范数值——

● 当p=1时,计算矩阵A的1阶范数,相当于max(sum(abs(A)));

● 当p=2时,计算矩阵A的2阶范数,相当于norm(A);

● 当p=inf时,计算矩阵A的正无限阶范数,相当于max(sum(abs(A')))。

● 当p= 'fro’时,计算矩阵A的F范数(Frobenius范数)。

另外,函数normest可以估计矩阵的二阶范数,该函数的调用格式如下:

    normest(S):估计矩阵S的2阶范数值,默认允许的相对误差为1e-6;
    normest(S, tol):使用tol作为允许的相对误差,估计矩阵S的2阶范数值。

例6-33,求向量范数示例。

在命令行窗口输入:

    N2=norm(1:6,2)
    Np=norm(1:6, inf)
    Nn=norm(1:6, -inf)

输出结果如下:

    N2 =     9.5394
    Np =      6
    Nn =      1

例6-34,求矩阵的范式示例。

在命令行窗口输入:

    A=[1 2 3;3 4 5;7 8 9];
    N1=norm(A,1)           %矩阵的1阶范式
    N2=norm(A)             %矩阵的2阶范式
    Np=norm(A, inf)        %矩阵的无穷范式
    Nf=norm(A, 'fro')      %矩阵的F范式
    Ne2=normest(A)         %矩阵的2阶范式的估计值 

输出结果如下:

    N1 =     17
    N2 =    16.0216
    Np =     24
    Nf =    16.0624
    Ne2 =    16.0216

2.矩阵的秩

矩阵中线性无关的列向量个数称为列秩,线性无关的行向量个数称为行秩。MATLAB提供函数rank来计算矩阵的秩,该函数调用格式如下:

    rank(A):用默认允许误差计算矩阵的秩;
    rank(A, tol):在给定允许误差内计算矩阵的秩。

例6-35,求矩阵的秩示例。

在命令行窗口输入:

    A=[1 2 3;3 4 5;7 8 9];
    B=eye(3);
    r1=rank(A)              %矩阵的秩
    r2=rank(B)        %矩阵的秩

输出结果如下:

    r1 =      2
    r2 =      3

提示

结果说明,矩阵B为满秩矩阵,矩阵A不是满秩矩阵。

3.矩阵的行列式

MATLAB提供函数det来计算矩阵的行列式。该函数的调用格式为d = det(X)。

例6-36,求矩阵的行列式示例。

在命令行窗口输入:

    A=[1 2 3;3 4 5;7 8 9];
    B=eye(3);
    r1=det(A)               %矩阵的行列式
    r2=det(B)               %矩阵的行列式

输出结果如下:

    r1 =      0
    r2 =      1

4.矩阵的迹

MATLAB提供函数trace来计算矩阵的迹。该函数的调用格式为b = trace(A)。

例6-37,求矩阵的迹示例。

在命令行窗口输入:

    A=[1 2 3;3 4 5;7 8 9];
    B=eye(3);
    t1=trace(A)       %矩阵的迹
    t2=trace(B)       %矩阵的迹

输出结果如下:

    t1 =     14
    t2 =      3

5.矩阵的化零矩阵

MATLAB提供函数null来计算矩阵的化零矩阵。该函数的调用格式为:

    Z = null(A):返回矩阵A的一个化零矩阵,如果化零矩阵不存在则返回空矩阵;
    Z = null(A, 'r'):返回矩阵A的有理数形式的化零矩阵。

例6-38,求矩阵的化零矩阵。

在命令行窗口输入:

    A=[1 2 3;3 4 5;7 8 9];
    Z=null(A)               %求矩阵A的有理数形式的零矩阵
    AZ=A*Z             %验证化零矩阵
    ZR=null(A, 'r')        %求矩阵A的有理数形式的化零矩阵
    P=A*ZR             %验证化零矩阵

输出结果如下:

    Z = 0.4082
      -0.8165
        0.4082
    AZ =  -0.2220*1.0e-15
            0
            0
    ZR = 1
        -2
        1
    P =  0
        0
        0

6.矩阵的正交空间

MATLAB提供函数null来求解矩阵的正交空间。该函数的调用格式为B = orth(A)。

例6-39,求矩阵的正交空间示例。

在命令行窗口输入:

    A=[1 2 3;3 4 5;7 8 9];
    Q=orth(A)

输出结果如下:

    Q =  -0.2262    -0.8143
         -0.4404    -0.4040
        -0.8688     0.4168

7.矩阵空间夹角

MATLAB提供函数subspace来求解矩阵的正交空间。该函数的调用格式为theta=subspace(A, B),返回矩阵A和矩阵B之间的夹角。

例6-40,求矩阵A和B之间的夹角示例。

在命令行窗口输入:

    A=[0 0 3;3 4 5;7 8 9];
    B=magic(3);
    theta=subspace(A, B)

输出结果如下:

    theta =    9.3770e-16

6.4.2 矩阵分解

矩阵分解是把一个复杂矩阵分解成几个结构简明的矩阵的乘积。本小节将介绍几种矩阵分解的方法,相关函数如表6.3所示。

表6.3 矩阵分解函数

除表中列出的分解方式外,还有更多不常用的分解方式,本书不作介绍,请读者参考有关书籍和帮助文件。

1.对称正定矩阵的Cholesky分解

Cholesky分解在MATLAB中用函数chol来实现,其常用的调用方式如下:

    R = chol(A)
    L = chol(A, 'lower')
    [R, p] = chol(A)
    [L, p] = chol(A, 'lower')
    [R, p, s] = chol(A)
    [R, p, s] = chol(A, 'vector')
    [L, p, s] = chol(A, 'lower', 'vector')

其中,A为对称正定矩阵,若为非正定矩阵则函数返回出错信息;R是上三角矩阵,满足R'*R=A; L是下三角矩阵,满足L*L'=A; p为上三角矩阵的阶数,满足A(1:p-1,1:p-1)=R'*R。

例6-41, Cholesky矩阵分解示例。

在命令行窗口输入:

    A=pascal(5)            %产生5阶帕斯卡矩阵
    B=A-1
    C=chol(A)                    %获取上三角分解矩阵
    J1=isequal(C'*C, A)         %验证
    L = chol(A, 'lower')         %获取上三角分解矩阵
    J2=isequal(L*L', A)         %验证
    CB=chol(B)              %分解非正定矩阵

输出结果如下:

    A =  1      1      1      1      1
        1      2      3      4      5
        1      3      6     10     15
        1      4     10     20     35
        1      5     15     35     70
    B =  0      0      0      0      0
        0      1      2      3      4
        0      2      5      9     14
        0      3      9     19     34
        0      4     14     34     69
    C =  1      1      1      1      1
        0      1      2      3      4
        0      0      1      3      6
        0      0      0      1      4
        0      0      0      0      1
    J1 = 1
    L =  1      0      0      0      0
        1      1      0      0      0
        1      2      1      0      0
        1      3      3      1      0
        1      4      6      4      1
    J2 = 1
    Error using chol
    Matrix must be positive definite.

2.LU分解

LU分解可以将任意一个方阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积,即A=LU。LU分解在MATLAB中用函数lu来实现,其调用格式如下:

    Y = lu(A)
    [L, U] = lu(A)
    [L, U, P] = lu(A)

其中,A为方阵,L为下三角矩阵,U为上三角矩阵,满足关系X=L*U, P为置换矩阵,满足关系P*A = L*U, Y把上三角矩阵和下三角矩阵合并在矩阵中给出,满足Y=L+U-I。

提示

可以利用LU分解来计算矩阵的行列式的值和矩阵的逆,其命令形式如下:

det(A)=det(L)*det(U)

inv(A)=inv(U)*inv(L)

例6-42, LU分解示例。

在命令行窗口输入:

    A = [ 3 2 4; 9 5 6; 1 8 0 ];
    [L1, U1]=lu(A)                    %矩阵的LU分解
    J1=isequal(L1*U1, A)             %验证
    [L2, U2, P]=lu(A)
    J2=isequal(L2*U2, P*A)          %验证
    Y=lu(A)
    J3=isequal(Y, L2+U2-eye(size(A)))      %验证

输出结果如下:

    L1 = 0.3333     0.0448     1.0000
        1.0000           0          0
        0.1111     1.0000           0
    U1 = 9.0000     5.0000     6.0000
            0     7.4444    -0.6667
            0           0     2.0299
    J1 =  1
    L2 =1.0000           0          0
        0.1111     1.0000           0
        0.3333     0.0448     1.0000
    U2 = 9.0000     5.0000     6.0000
            0     7.4444     -0.6667
            0           0     2.0299
    P =  0      1      0
        0      0      1
        1      0      0
    J2 =  1
    Y = 9.0000     5.0000     6.0000
        0.1111     7.4444    -0.6667
        0.3333     0.0448     2.0299
    J3 =  1

3.正交分解

正交分解又称QR分解。QR分解把一个m×n的矩阵A分解为一个正交矩阵Q和一个上三角矩阵R的乘积,即A=Q*R。在MATLAB中QR分解由函数qr来实现,其调用格式如下:

    R = qr(A)
    R = qr(A,0)
    [Q, R] = qr(A)
    [Q, R] = qr(A,0)
    [Q, R, E] = qr(A)
    [Q, R, e] = qr(A,0)
    [C, R] = qr(A, B)
    [C, R, E] = qr(A, B)

其中,A为待分解矩阵;Q为正交矩阵;R为上三角矩阵;参数0代表则只计算矩阵Q的前n列元素,得到的R为n×n的矩阵;E为置换矩阵,满足A*E=Q*R;矩阵B与矩阵A具有相同的行数。

例6-43, QR分解示例。

在命令行窗口输入:

    A = [ 3 2 4; 9 5 6; 1 8 0 ];
    R1 = qr(A)
    [Q2, R2]=qr(A)
    B=[1 3 5 6;8 2 7 3;1 3 5 9];
    [Q3, R3, E3] = qr(B)

输出结果如下:

    R1 =    -9.5394    -6.1849    -6.9187
          0.7177     7.3991    -0.6475
          0.0797    -0.8880    -1.9268
    Q2 =    -0.3145     0.0074    -0.9492
          -0.9435    -0.1129     0.3117
          -0.1048     0.9936     0.0425
    R2 =    -9.5394    -6.1849    -6.9187
            0        7.3991    -0.6475
            0             0    -1.9268
    Q3 =-0.5345     0.1167    -0.8371
        -0.2673    -0.9629     0.0364
        -0.8018     0.2432     0.5459
    R3 = -11.2250    -3.4744    -8.5524    -4.5434
          0    -7.3436    -4.9411    -0.8462
          0        0     -1.2010    -0.8007
    E3 = 0      1      0      0
        0      0      0      1
        0      0      1      0
        1      0      0      0

6.4.3 特征值与特征向量

MATLAB中矩阵特征值与特征向量相关函数的调用格式及其功能如下:

(1)d = eig(A)

包含矩阵A的特征值向量d;

(2)[V, D] = eig(A)

求矩阵A的特征值在对角线上的对角矩阵D和矩阵V,满足AV=VD。

(3)d = eigs(A)

求由矩阵A的部分特征值组成的向量,最多计算6个特征值。

(4)[V, D] = eig(A, B)

求矩阵A的特征值向量V,和特征向量D(满足A*V = B*V*D)。

例6-44,矩阵特征值与特征向量计算示例。

在命令行窗口输入:

    A = magic(3);
    [V, D] = eig(A)
    R= V*D-A*V

输出结果如下:

    V =  -0.5774    -0.8131    -0.3416
        -0.5774     0.4714    -0.4714
        -0.5774     0.3416     0.8131
    D =15.0000           0           0
            0     4.8990           0
            0           0    -4.8990
    R =1.0e-14 *
      -0.1776    -0.4885    -0.0888
      -0.3553    -0.0444    -0.0444
       0.1776    -0.1332    -0.1776

6.4.4 矩阵函数运算

MATLAB提供的部分矩阵运算函数及其功能如表6.4所示。

表6.4 矩阵运算函数

下面介绍这几个函数的用法。

1.矩阵指数运算

MATLAB提供函数expm用于矩阵指数的运算。其调用格式如下:

    Y = expm(X)

该函数返回矩阵X的指数。满足:

    [V, D] = EIG(X) 且expm (X) = V*diag(exp(diag(D)))/V。

例6-45, expm与exp函数对矩阵运算的比较示例。

在命令行窗口输入:

    A = [1 1 0; 0 0 2; 0 0-1]
    expmA=expm(A)
    expA=exp(A)

输出结果如下:

    A =  1      1      0
        0      0      2
        0      0     -1
    expmA =2.7183     1.7183     1.0862
            0     1.0000     1.2642
            0           0     0.3679
    expA =2.7183     2.7183     1.0000
          1.0000     1.0000     7.3891
          1.0000     1.0000     0.3679

2.矩阵对数运算

矩阵对数运算是矩阵指数运算的逆运算。MATLAB提供函数logm来实现矩阵对数运算,其调用格式如下:

    L = logm(A)
    [L, exitflag] = logm(A)

其中,L为矩阵A的对数,exitflag为运算标识;当exitflag为0时,函数成功运行;当exitflag为1时,表明运算过程中某些泰勒级数不收敛,但运算结果仍可能精确。

例6-46,矩阵对数运算示例

在命令行窗口输入:

    A = [1 1 0; 0 0 2; 0 0-1];
    expmA=expm(A);
    A1=logm(expmA)

输出结果如下:

    A1 =1.0000     1.0000     0.0000
            0           0    2.0000
            0           0  -1.0000

3.矩阵开方运算

MATLAB提供两种计算矩阵平方根的方法,分别为A^0.5形式运算和sqrtm(A)命令,但函数sqrtm比A^0.5的运算精度更高。

函数sqrtm的调用格式如下:

    X = sqrtm(A)

函数返回矩阵A的平方根X,如果矩阵A是奇异的,将返回警告信息。

例6-47,矩阵开方运算示例。

在命令行窗口输入:

    A = [7 10; 15 22]
    A=A*A
    B1=sqrtm(A)
    B2=A^0.5

输出结果如下:

    A =  7     10
        15     22
    A =199    290
      435    634
    B1 =7.0000    10.0000
      15.0000    22.0000
    B2 =7.0000    10.0000
      15.0000    22.0000

4.非线性矩阵函数运算

MATLAB提供了计算一般非线性矩阵函数运算的函数funm,其调用格式如下:

    F = funm(A, fun)

该函数为方阵A进行fun函数的运算,返回方阵F。其中,fun为函数句柄,可以进行的调用格式如表6.5所示。

表6.5 非线性矩阵运算函数

例6-48,非线性矩阵函数运算示例。

在命令行窗口输入:

    X=magic(3);
    E = expm(i*X);
    C1 = funm(X, @cos)
    C2 = real(E)
    S1 = funm(X, @sin)
    S2 = imag(E)

输出结果如下:

    C1 =-0.1296    -0.3151    -0.3151
        -0.3151    -0.1296    -0.3151
        -0.3151    -0.3151    -0.1296
    C2 =-0.1296    -0.3151    -0.3151
        -0.3151    -0.1296    -0.3151
        -0.3151    -0.3151    -0.1296
    S1 =-0.3850     1.0191     0.0162
          0.6179     0.2168    -0.1844
          0.4173    -0.5856     0.8185
    S2 =-0.3850     1.0191     0.0162
          0.6179     0.2168    -0.1844
          0.4173    -0.5856     0.8185