全网最详细的矩阵分解算法

目录

参考资料

MATLAB数值分析

矩阵的分解

矩阵的分解是矩阵分析的一个重要工具,如求矩阵的特征值和特征向量求矩阵的逆以及矩阵的秩等都要利用到矩阵分解。

Cholesky分解

Cholesky分解的使用

Cholesky分解是把一个对称正定矩阵 A \mathbf{A} A 分解成为一个上三角矩阵 R \mathbf{R} R其转置矩阵的乘积:
A = R ′ R \mathbf{A}=\mathbf{R}^{\prime} \mathbf{R} A=RR
​ 从理论的角度来看,并不是所有的对称矩阵都可以进行Cholesky分解,需要进行 Cholesky分解的矩阵必须是正定的。

[!NOTE]

对称正定矩阵即可进行Cholesky分解

在 MATLAB 中提供了 chol函数实现矩阵的Cholesky分解,其调用格式如下。

  1. R = chol ⁡ ( A ) \mathbf{R}=\operatorname{chol}(\mathbf{A}) R=chol(A)
    1. 其中 A \mathbf{A} A对称正定矩阵 R \mathbf{R} R 为上三角矩阵,使得 X = R ′ R \mathbf{X}=\mathbf{R}^{\prime} \mathbf{R} X=RR
    2. 如果矩阵 A \mathbf{A} A是非正定矩阵,则使用该调用格式会返回错误信息。
  2. [ R , p ] = chol ⁡ ( A ) [\mathbf{R}, p]=\operatorname{chol}(\mathbf{A}) [R,p]=chol(A)
    1. A \mathbf{A} A正定矩阵,返回矩阵 R \mathbf{R} R上三角矩阵,满足等式 X = R ′ R \mathbf{X}=\mathbf{R}^{\prime} \mathbf{R} X=RR 同时返回参数 p = 0 \mathrm{p}=0 p=0
    2. A \mathbf{A} A 不是正定矩阵时,返回参数 p 是正整数, R \mathbf{R} R三角矩阵,且矩阵阶数为p-1,并且满足等式 A ( 1 : p − 1 , 1 : p − 1 ) = R ′ R \mathbf{A}\left(1: \mathbf{p}-1,1: p-1)=\mathbf{R}^{\prime} \mathbf{R}\right. A(1:p1,1:p1)=RR

利用pascal函数创建对称正定矩阵并进行Cholesky分解:

%矩阵分解-Cholesky分解
clear all
n=5
X=pascal(n) %创建对称矩阵
R=chol(X)		%对对称正定矩阵进行正定分解

image-20250327172110888

X(n,n)=X(n,n)-1 %修改矩阵为非正定矩阵
[R1,p]=chol(X)		%对非正定矩阵进行三角分解

image-20250327172150287

Chlolesky分解求解线性方程组

​ 使用 Cholesky分解求解得到的线性方程组的数值解和使用左除法求解线性方程组的数值解相一致。其数学原理为:

​ 对于线性方程组 A x = b \mathbf{A x}=\mathbf{b} Ax=b ,其中 A \mathbf{A} A对称正定矩阵,其 A = R T R \mathbf{A}=\mathbf{R}^{\mathrm{T}} \mathbf{R} A=RTR ,则根据上面的定义,线性方程组可以转换为 R T R x = b \mathbf{R}^{\mathrm{T}} \mathbf{R} \mathbf{x}=\mathbf{b} RTRx=b ,该方程组的数值为:
x = ( R T R ) − 1 b = R \ ( R T \ b ) \mathbf{x}=(\mathbf{R}^{T}\mathbf{R})^{-1}\mathbf{b}=\mathbf{R} \backslash\left(\mathbf{R}^{\mathrm{T}} \backslash \mathbf{b}\right) x=(RTR)1b=R\(RT\b)


使用 Cholesky 分解求解线性方程组:
{ x 1 + x 2 + x 3 + x 4 = 1 x 1 + 2 x 2 + 3 x 3 + 4 x 4 = 4 x 1 + 3 x 2 + 6 x 3 + 10 x 4 = 6 x 1 + 4 x 2 + 10 x 3 + 20 x 4 = 13 \left\{\begin{array}{l} x_1+x_2+x_3+x_4=1 \\ x_1+2 x_2+3 x_3+4 x_4=4 \\ x_1+3 x_2+6 x_3+10 x_4=6 \\ x_1+4 x_2+10 x_3+20 x_4=13 \end{array}\right. x1+x2+x3+x4=1x1+2x2+3x3+4x4=4x1+3x2+6x3+10x4=6x1+4x2+10x3+20x4=13
可以看到系数矩阵是对称正定的,故可直接使用cholesky分解求解:

%使用cholesky分解求解系数矩阵为对称正定矩阵的线性方程组:
A=[1,1,1,1;1,2,3,4;1,3,6,10;1,4,10,20]
b=[1,4,6,13]'
x=A\b %使用左除法求解线性方程组
R=chol(A) %Cholesky分解
Rt=transpose(R)
x1=R\(Rt\b)		%x1=R\(b/Rt)=(b/Rt)/R

image-20250327173755835

[!NOTE]

算数左除\与算数右除/:

​ MATLAB 的除法运算对于简单数值而言,算术左除与算术右除是不同的。算术右除与传统的除法相同,即 a / b = a ÷ b a / b=a \div b a/b=a÷b ;而算术左除与传统的除法相反,即 a \ b = b ÷ a a \backslash b=b \div a a\b=b÷a

对矩阵而言,算术右除相当于求解线性方程组;算术左除与传统的高斯消元法解线性方程或者用最小二乘法解欠定方程(超定方程)相似。点左除与点右除与上面的点运算相似,是变量对应于元素进行除法运算。

LU分解

LU分解的使用

​ LU 分解可用于求行列式求逆矩阵求解线性方程组等。设 A \mathbf{A} A M × N \mathbf{M} \times \mathbf{N} M×N 矩阵,如果 A \mathbf{A} A(或 A \mathbf{A} A 的某个排列 P A ,   P \mathbf{P A}, ~ \mathbf{P} PA, P置换矩阵)可分解 A = L U \mathbf{A}=\mathbf{L U} A=LU(或 P A = L U \mathbf{P A}=\mathbf{L U} PA=LU ),其中 L \mathbf{L} L M \mathbf{M} M下三角矩阵 U \mathbf{U} U M × N \mathbf{M} \times \mathbf{N} M×N 阶梯形,则上式称 A \mathbf{A} ALU分解Cholesky分解可看做 LU分解的特列。

[!NOTE]

LU分解将一个 M × N \mathbf{M} \times \mathbf{N} M×N 矩阵的 A \mathbf{A} A,分解为 M \mathbf{M} M下三角矩阵 L \mathbf{L} L M × N \mathbf{M} \times \mathbf{N} M×N 阶梯形矩阵 U \mathbf{U} U

在 MATLAB 中提供了 lu函数实现 LU分解,其调用格式如下。

  1. [L,U]=lu(A):
    1. 对矩阵 A \mathbf{A} A 进行 L U L U LU 分解,其中 L \mathbf{L} L单位下三角矩阵或其变换形式, U \mathbf{U} U上三角矩阵
  2. [L,U,P]=lu(A):
    1. 对矩阵 A \mathbf{A} A 进行 L U P L UP LUP 分解,其中 L \mathbf{L} L单位下三角矩阵 U \mathbf{U} U上三角矩阵 P \mathbf{P} P置换矩阵,满足 L U = P A \mathbf{L U}=\mathbf{P A} LU=PA
  3. Y=lu(A):
    1. 其中 A \mathbf{A} A任意方阵,把上三角矩阵下三角矩阵合并在矩阵 Y \mathbf{Y} Y 中给出,满足 Y = L + U − I \mathbf{Y}=\mathbf{L}+\mathbf{U}-\mathbf{I} Y=L+UI ,该调用格式将损失置换矩阵 P \mathbf{P} P 的信息。
  4. [L,U,P,Q]=lu(A):
    1. 其中 L \mathbf{L} L单位下三角矩阵 U \mathbf{U} U上三角矩阵 P \mathbf{P} P Q \mathbf{Q} Q 为为置换矩阵,满足 P A Q = L U \mathbf{P}\mathbf{A} \mathbf{Q}=\mathbf{L} \mathbf{U} PAQ=LU
  5. [L,U,P,Q,R]=lu(A):
    1. 其中 L \mathbf{L} L单位下三角矩阵 U \mathbf{U} U上三角矩阵 P \mathbf{P} P Q \mathbf{Q} Q 为为置换矩阵 R \mathbf{R} R对角矩阵,满足 P ( R \ A ) Q = L U \mathbf{P}(\mathbf{R} \backslash \mathbf{A}) \mathbf{Q}=\mathbf{L} \mathbf{U} P(R\A)Q=LU

利用lu函数对矩阵进行LU分解

clear all;
A=[1,2,3;4,5,6;7,8,0]
[L1,U]=lu(A)		%LU分解
[L2,U,P]=lu(A)	%LUP分解

image-20250327180800597

LU分解求解线性方程组

利用LU求解线性方程组就没有QR求解的要求高了,其不需要系数矩阵是对称正定的。


{ 5.8 x 1 − x 2 − x 3 + 4.6 x 4 = 21.3 7 x 1 − 8 x 2 + x 3 − 30.3 x 4 = − 15.7 9.5 x 1 + 2 x 2 + 5 x 3 − x 4 = 16.6 6 x 1 − x 2 + 12.9 x 3 + 10 x 4 = 7.9 \left\{\begin{array}{l}5.8 x_1-x_2-x_3+4.6 x_4=21.3 \\ 7 x_1-8 x_2+x_3-30.3 x_4=-15.7 \\ 9.5 x_1+2 x_2+5 x_3-x_4=16.6 \\ 6 x_1-x_2+12.9 x_3+10 x_4=7.9\end{array}\right. 5.8x1x2x3+4.6x4=21.37x18x2+x330.3x4=15.79.5x1+2x2+5x3x4=16.66x1x2+12.9x3+10x4=7.9

利用LU分解求解上述线性方程组:

%矩阵分解-LU分解
clear all
A=[5.8,-1,-1,4.6;7,-8,1,-30.3;9.5,2,5,-1;6,-1,12.9,10]
b=[21.3,-15.7,16.6,7.9]'
det(A)  %先看一下A是不是可逆的
x=A\b		%左除法求解
[L,U]=lu(A) %LU分解求解
y1=L\b
x1=U\y1		%用LU分解求线性方程组的解

image-20250327182134824

[L,U,P]=lu(A)	%lu分解
y2=L\b
x2=U\y2

[!NOTE]

此处的运算得到的是Px

QR分解

QR分解在解决最小二乘问题,特征值计算等方面有十分重要的应用。设 A \mathbf{A} A M × N M \times N M×N 矩阵,如果存在 M × N M \times N M×N 酉矩阵 Q \mathbf{Q} Q(即 Q T Q = Q Q T = I \mathbf{Q}^{\mathrm{T}} \mathbf{Q}=\mathbf{Q} \mathbf{Q}^{\mathrm{T}}=\mathbf{I} QTQ=QQT=I )和 M × N M \times N M×N 阶梯形矩阵 R \mathbf{R} R ,使得 A = Q R \mathbf{A}=\mathbf{Q R} A=QR ,则称此分解为 A \mathbf{A} AQR分解

[!NOTE]

将任意矩阵 M × N M\times N M×N A \mathbf{A} A,分解成 M × N M\times N M×N酉矩阵 Q \mathbf{Q} Q M × N M\times N M×N阶梯形矩阵 R \mathbf{R} R

在 MATLAB 中提供了qr函数实现 QR分解,其调用格式如下。

  1. [Q, R]=qr(A) :
    1. 求得正交矩阵 Q \mathbf{Q} Q上三角矩阵 R , Q \mathbf{R}, \mathbf{Q} R,Q R \mathbf{R} R 满足 A = Q R \mathbf{A}=\mathbf{Q R} A=QR
  2. [Q,R]=qr(A,0):
    1. 产生矩阵 A \mathbf{A} A 的"经济大小"分解。
  3. [Q,R,E]=qr(A):
    1. 求得正交矩阵 Q \mathbf{Q} Q上三角矩阵 R \mathbf{R} R单位矩阵的变换形式矩阵 E , R \mathbf{E}, \mathbf{R} E,R 的对角线元素按大小降序排列,满足 A E = Q R \mathbf{A E}=\mathbf{Q R} AE=QR
  4. [Q,R,E]=qr(A,0):
    1. E \mathbf{E} E的使用使得 R \mathbf{R} R对角线元素降序,且 Q R = A ( : , E ) \mathbf{Q} \mathbf{R}=\mathbf{A}(:, \mathbf{E}) QR=A(:,E)
  5. R=qr(A)
    1. 稀疏矩阵 A \mathbf{A} A 的分解,只产生一个上三角矩阵 R \mathbf{R} R ,满足 R T R = A T A \mathbf{R}^{\mathrm{T}} \mathbf{R}=\mathbf{A}^{\mathrm{T}} \mathbf{A} RTR=ATA ,这种方法计算 A T A \mathbf{A}^{\mathrm{T}} \mathbf{A} ATA减少了内在数字信息的损耗
  6. [C,R]=qr(A,B,0):
    1. [ C , R ] = q r ( A , B , 0 ) : [\mathrm{C}, \mathrm{R}]=\mathrm{qr}(\mathrm{A}, \mathrm{B}, 0): [C,R]=qr(A,B,0): 针对稀疏矩阵最小二乘问题的经济型分解。
  7. [Q,R]=qrdelete(Q,R,j):
    1. 返回将矩阵 A \mathbf{A} A 的第 j 列移去后的新矩阵的 Q R Q R QR 分解。
  8. [Q,R]=qrinsert(Q,R,j,x);
    1. 在矩阵 A A A 中第 j j j 列插入向量 x x x 后的新矩阵进行 Q R Q R QR 分解。
    2. 如果 j j j大于 A \mathbf{A} A 的列数,表示在 A \mathbf{A} A 的最后插入列 x \mathbf{x} x

对矩阵 A = ( 1 2 3 4 5 6 1 0 1 0 1 1 ) \mathbf{A}=\left(\begin{array}{lll}1 & 2 & 3 \\ 4 & 5 & 6 \\ 1 & 0 & 1 \\ 0 & 1 & 1\end{array}\right) A= 141025013611 进行 QR分解:

%QR分解
A=[1,2,3;4,5,6;1,0,1;0,1,1]
[Q,R]=qr(A)

image-20250327202712537

对上例中的矩阵 A \mathbf{A} A,去掉其第2行以及插入第2行,求新矩阵的QR分解

clear all
A=[1,2,3;4,5,6;1,0,1;0,1,1]
[Q,R]=qr(A)		%qr分解
[Q1,R1]=qrdelete(Q,R,2,'row') %去掉A的第2行后的新矩阵进行QR分解
Q1*R1			%验证去掉第2行的矩阵

image-20250327203347327

clear all
A=[1,2,3;4,5,6;1,0,1;0,1,1]
[Q,R]=qr(A)		%qr分解
[Q2,R2]=qrinsert(Q,R,2,1:3,'row') %插入第2行后(1,2,3)的新矩阵进行QR分解
Q2*R2			%验证插入第2行的矩阵

image-20250327203436759

SVD分解

​ 设 A \mathbf{A} A M × N \mathrm{M} \times \mathrm{N} M×N 矩阵, A H A \mathbf{A}^{\mathrm{H}} \mathbf{A} AHA特征值 λ 1 ⩾ λ 2 ⩾ ⋯ ⩾ λ r ⩾ λ r + 1 = ⋯ = λ n = 0 \lambda_1 \geqslant \lambda_2 \geqslant \cdots \geqslant \lambda_{\mathrm{r}} \geqslant \lambda_{\mathrm{r}+1}=\cdots=\lambda_{\mathrm{n}}=0 λ1λ2λrλr+1==λn=0 ,则称:
σ i = λ i ( i = 1 , 2 , ⋯   , r ) \sigma_i=\sqrt{\lambda_i}(i=1,2, \cdots, r) σi=λi (i=1,2,,r)
为矩阵 A \mathbf{A} A奇异值 r r r A \mathbf{A} A

存在 M M M酉矩阵 U \mathbf{U} U N N N酉矩阵 V \mathbf{V} V,使得:
A = U ( ∑ 0 r × ( N − r ) 0 ( M − r ) × r 0 ( M − r ) × ( N − r ) ) V \mathbf{A}=\mathbf{U}\left(\begin{array}{cc}\sum & 0_{\mathrm{r} \times(\mathrm{N}-\mathrm{r})} \\ 0_{(M-r) \times r} & 0_{(M-r) \times(\mathrm{N}-\mathrm{r})}\end{array}\right) \mathbf{V} A=U(0(Mr)×r0r×(Nr)0(Mr)×(Nr))V
其中 Σ = ( σ 1 σ 2 ⋱ σ r ) \Sigma=\left(\begin{array}{cccc}\sigma_1 & & & \\ & \sigma_2 & & \\ & & \ddots & \\ & & & \sigma_r\end{array}\right) Σ= σ1σ2σr ,上式称 A \mathbf{A} ASVD分解(奇异值分解)


在 MATLAB 中提供了svd函数实现奇异值分解,其调用格式如下:

  1. s=svd(X):
    1. 返回向量 s \mathbf{s} s 包含矩阵 X \mathbf{X} X 分解所得到的全部奇异值向量
  2. [U,S,V]=svd(X):
    1. 返回一个与 X \mathbf{X} X 同大小的对角矩阵 S \mathbf{S} S 和两个酉矩阵 U \mathbf{U} U V \mathbf{V} V ,且满足 X = \mathbf{X}= X= U S V ′ \mathbf{U} \mathbf{S} \mathbf{V}^{\prime} USV
  3. [U,S,V]=svd(X,0):
    1. 得到一个经济大小的分解。
    2. 如果 m > n \mathrm{m}>\mathrm{n} m>n 维矩阵 X \mathbf{X} X 中, m > n \mathrm{m}>\mathrm{n} m>n 只能计算出矩阵 U \mathbf{U} U 的前 n n n 列,矩阵 S \mathbf{S} S 的大小为 n × n n \times n n×n
  4. [U,S,V]=svd(X,‘econ’):
    1. 参数 econ 也采用经济分解的方式。
    2. m > n \mathrm{m}>\mathrm{n} m>n 时,与 svd ⁡ ( X , 0 ) \operatorname{svd}(\mathrm{X}, 0) svd(X,0)相同;
    3. m < n \mathrm{m}<\mathrm{n} m<n 时,函数仅计算 V 的前 m 列, S 为 m 阶方阵。

求矩阵 A = ( 1 2 3 4 5 6 7 8 ) \mathbf{A}=\left(\begin{array}{ll}1 & 2 \\ 3 & 4 \\ 5 & 6 \\ 7 & 8\end{array}\right) A= 13572468 奇异值SVD分解

%矩阵的SVD分解
clear all
A=[1,2;3,4;4,6;7,8]
s=svd(A)	%求A的奇异值
[U,S,V]=svd(A)		%求A的奇异值分解
[U,S,V]=svd(A,0)	%对A进行经济型奇异分解

image-20250327204326263

Schur分解

对任意方阵 A \mathbf{A} A ,其 S c h u r \mathbf{S c h u r} Schur分解为:
A = U S U H \mathbf{A}=\mathbf{U S U}^{\mathrm{H}} A=USUH
其中 U \mathbf{U} U标准正交矩阵(即 U U H = I \mathbf{U U}^{\mathrm{H}}=\mathbf{I} UUH=I ), S \mathbf{S} S上三角矩阵 S \mathbf{S} S 对角线上的元素为 A \mathbf{A} A特征值

在 MATLAB 中提供了schur函数实现 Schur 分解,其调用格式如下:

  1. T=schur(A):
    1. 返回 Schur ⁡ \operatorname{Schur} Schur 矩阵 T \mathbf{T} T ,如果 A \mathbf{A} A复特征值,则相应的对角元以 2 × 2 2 \times 2 2×2 的块矩阵形式给出。
  2. T=schur(A,flag):
    1. 如果 A \mathbf{A} A 有复特征值,则 flag=complex;否则 flag=real。
  3. [U,T]=schur(A,…):
    1. 返回酉矩阵 U \mathbf{U} USchur矩阵 T \mathbf{T} T

求矩阵 A = ( 1 2 3 2 3 1 1 3 0 ) \mathbf{A}=\left(\begin{array}{lll}1 & 2 & 3 \\ 2 & 3 & 1 \\ 1 & 3 & 0\end{array}\right) A= 121233310 Schur分解及其 Schur复分解

clear all
A=[1,2,3;2,3,1;1,3,0]
[U,T]=schur(A)		%矩阵A的schur分解
[CU,CT]=schur(A,'complex')		%矩阵A的schur复分解

image-20250327205001124

Hessenberg分解

​ 如果矩阵 H \mathbf{H} H第一子对角线下元素都是 0 ,则 H \mathbf{H} H(或其转置形式)称为上(下) Hessenberg 矩阵。这种矩阵在零元素所占比例及分布上都接近三角矩阵,虽然其在特征值等性质方面不如三角矩阵那样简单,但在实际应用中,应用相似变换将一个矩阵化为 Hessenberg矩阵可行的,而化为三角矩阵不易实现;而且通过化为 Hessenberg 矩阵来处理矩阵计算问题能够大大节省计算量,因此在工程计算中,Hessenberg分解也是常用的工具之一。

在MATLAB中提供了hess函数实现了Hessenberg分解

  1. H=hess(A):
    1. 返回矩阵 A \mathbf{A} A 上的 Hessenberg 形式。
  2. [P,H]=hess(A):
    1. 返回一个上Hessenberg矩阵 H \mathbf{H} H 及一个酉矩阵 P \mathbf{P} P ,满足 A = P H P \mathbf{A}=\mathbf{P H P} A=PHP P ∗ P = I \mathbf{P}^* \mathbf{P}=\mathbf{I} PP=I
  3. [AA,BB,Q,Z]=hess(A,B):
    1. 对于方阵 A ,   B \mathbf{A}, ~ \mathbf{B} A, B ,返回上Hessenberg矩阵 A A \mathbf{A A} AA ,上三角矩阵 B B \mathbf{B B} BB酉矩阵 Q ,   Z \mathbf{Q}, ~ \mathbf{Z} Q, Z
    2. 满足 Q A Z = A A \mathbf{Q A Z}=\mathbf{A A} QAZ=AA Q B Z = B B \mathbf{Q B Z}=\mathbf{B B} QBZ=BB

将矩阵 A = ( − 149 − 50 − 154 537 180 546 − 27 − 9 − 25 ) \mathbf{A}=\left(\begin{array}{ccc}-149 & -50 & -154 \\ 537 & 180 & 546 \\ -27 & -9 & -25\end{array}\right) A= 1495372750180915454625 化为 Hessenberg形式并求出变换矩阵 P \mathbf{P} P

clear all;
A=[-149,-50,-154;537,180,546;-27,-9,-25]
[P,H]=hess(A)

image-20250327205759362

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后厂村路小狗蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值