【C++游戏引擎开发】《线性代数》(6):SVD(奇异值分解)的数学原理与实现

时间:2025-04-07 20:30:08
给定一个秩为 r r r的矩阵 A ∈ R m × n \mathbf{A} \in \mathbb{R}^{m \times n} ARm×n(或 C m × n \mathbb{C}^{m \times n} Cm×n),其 SVD 分解为:
A = U Σ V T \mathbf{A} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T A=VT
其中:
- U ∈ R m × m \mathbf{U} \in \mathbb{R}^{m \times m} URm×m(或 C m × m \mathbb{C}^{m \times m} Cm×m)是正交矩阵(酉矩阵),其列向量称为左奇异向量
- V ∈ R n × n \mathbf{V} \in \mathbb{R}^{n \times n} VRn×n(或 C n × n \mathbb{C}^{n \times n} Cn×n)是正交矩阵(酉矩阵),其列向量称为右奇异向量
- Σ ∈ R m × n \mathbf{\Sigma} \in \mathbb{R}^{m \times n} ΣRm×n(或 C m × n \mathbb{C}^{m \times n} Cm×n)是对角矩阵,其非对角线元素为 0,对角线元素 σ 1 ≥ σ 2 ≥ ⋯ ≥ σ r > 0 \sigma_1 \geq \sigma_2 \geq \dots \geq \sigma_r > 0 σ1σ2σr>0称为奇异值,其余元素为 0。