矩阵的几种分解方式

矩阵的几种分解方式

A = LU

这实际上就是我们解矩阵方程组一般使用的方式,比如方程组是:

a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n = b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = b_2 \\ \cdots \\ a_{n1}x_1 + a_{n2}x_2 + \cdots + a_{nn}x_n = b_n \\

我们一般把它写成增广矩阵:

\begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\ a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\ & \cdots & \\ a_{n1} & a_{n2} & \cdots & a_{nn} & b_n \\ \end{bmatrix}\\

然后化简成阶梯型矩阵的形式,这个时候可以方便的算出 x_n ,然后再往上代回,逐渐得到所有的x。

如果我们实际来 coding,可能会出现的问题:

a_{11} 为0, 或者 a_{11} = \varepsilon \ll 1 ,那么我们化简第二行时 a_{22} - \frac{a_{21}}{a_{11}} * a_{12} 可能会误差很大

解决的办法就是行交换,把比较大的pivot放在前面。其实这个我们手动解 A\mathbf{x} = \mathbf{b} 的时候就会这样做。

这个方法叫做 Gaussian elimination with partial pivoting (GEPP). 实际上 Matlab 中用的一般也就是这个办法来解 A\mathbf{x} = \mathbf{b} , 当然在 Matlab 中我们一般如果要解答可以直接用 x = A\b 就可以知道了,不过我们如果想知道的明确 L,U矩阵我们可以 [L, U] = lu(A). 当然其实严密一点来说是如果我们用 [L,U] = lu(A)得到的这个L是一个permutaed lower triangle matrix,再加上交换才是严格的lower triangle,也就是 [L, U, P] = lu(A).

比如矩阵:

>> A = [1 2 -3; -3 -1 1; 1 -1 1];
>> [L, U] = lu(A)

L =

   -0.3333    1.0000         0
    1.0000         0         0
   -0.3333   -0.8000    1.0000


U =

   -3.0000   -1.0000    1.0000
         0    1.6667   -2.6667
         0         0   -0.8000

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

L =

    1.0000         0         0
   -0.3333    1.0000         0
   -0.3333   -0.8000    1.0000


U =

   -3.0000   -1.0000    1.0000
         0    1.6667   -2.6667
         0         0   -0.8000


P =

     0     1     0
     1     0     0
     0     0     1


A = QR

Q 代表的是正交矩阵,这里的 R 是 upper triangle 矩阵:

>> [Q,R] = qr(A)

Q =

   -0.3015   -0.7675    0.5657
    0.9045   -0.0426    0.4243
   -0.3015    0.6396    0.7071


R =

   -3.3166   -1.2060    1.5076
         0   -2.1320    2.8995
         0         0   -0.5657

我们可以通过 Gram–Schmidt 完成 QR 分解。


正交矩阵当然是具有很多很好特性的矩阵,比如:

  • QQ^T = I
  • det(Q) = ±1, 如果 det(Q) = 1 则为旋转变换,说起旋转变换又会想到SO(n) 李群和李代数
  • 可以给我们提供一组正交基

\mathbf{S = QΛQ^T}

当矩阵是一个实对称矩阵S(symmetric)的时候,我们可以把它分解成:

S = Q \Lambda Q^T \\

正交矩阵Q、 对角矩阵Λ(特征值)、正交矩阵的转置 Q^T

这个分解叫特征分解(Eigendecomposition),又称谱分解(Spectral decomposition),因为 Q 中是特征向量, Λ 中是特征值, q_1, \cdots, q_n 是跟 \lambda_1, \cdots, \lambda_n 这些特征值对应的特征向量。


当然在 Matlab中我们还是用 [V, D] = eig(S) 可以得到它的对应矩阵 Q 和 Λ.

>> A = [1 4 5; 4 2 6; 5 6 3];
>> issymmetric(A)

ans =

  logical

   1

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

V =

    0.3130    0.8096    0.4966
    0.5774   -0.5774    0.5774
   -0.7541   -0.1060    0.6481


D =

   -3.6687         0         0
         0   -2.5073         0
         0         0   12.1760

\mathbf{A = U \Sigma V^T}

SVD - 奇异值分解(singular value decomposition),之前写过PCA(主成分分析) 和 SVD (奇异值分解)

Matlab 中使用:

>> [U, S, V] = svd(A)

U =

   -0.7795   -0.4214    0.4634
    0.6107   -0.6760    0.4125
    0.1394    0.6045    0.7843


S =

    4.5807         0         0
         0    2.6280         0
         0         0    0.3323


V =

   -0.5397    0.8413    0.0309
   -0.5041   -0.2936   -0.8122
    0.6743    0.4539   -0.5825

\mathbf{A = LL^T}

Cholesky分解,当 A 是一个SPD (real Symmetric positive definite matrix)的时候,我们可以把它分解成 lower triangle 矩阵 L 和它的转置也就是 upper triangle L^T .


>> A = [4 12 -16; 12 37 -43; -16 -43 98];
>> R = chol(A)

R =

     2     6    -8
     0     1     5
     0     0     3

>> R'*R

ans =

     4    12   -16
    12    37   -43
   -16   -43    98

A=XΛX^{−1}

如果 A 可以对角化,那么 A 可以分解成 A=XΛX^−1 。 依旧可以使用特征值分解来解决这个问题。

发布于 2019-12-18 06:12