【C++游戏引擎开发】《线性代数》(4):矩阵求逆的LU分解实现(SIMD实现计算加速)
一、LU分解的数学原理详解
将可逆方阵 A A A 分解为下三角矩阵 L L L 和上三角矩阵 U U U 的乘积( A = L U A = LU A=LU),本质是高斯消元法的矩阵形式。
1.1 核心思想
通过行初等变换(不交换行),将矩阵 A A A转化为上三角矩阵 U U U,同时记录变换过程构造下三角矩阵 L L L,使得 L L L和 U U U的乘积等于原矩阵 A A A。
1.2 数学步骤
1.2.1 初始化:
- L L L 初始化为单位下三角矩阵(对角线为1)。
- U U U 初始化为 A A A 的副本。
1.2.2 逐列消元:
- 对每一列 k = 1 , 2 , … , n − 1 k = 1, 2, \ldots, n-1 k=1,2,…,n−1:
- 计算乘数:
m i k = U [ i , k ] U [ k , k ] ( i = k + 1 , … , n ) m_{ik} = \frac{U[i,k]}{U[k,k]} \quad (i = k+1, \ldots, n) mik=U[k,k]U[i,k](i=k+1,…,n) - 更新 L L L:将 m i k m_{ik} mik 存入 L [ i , k ] L[i,k] L[i,k]。
- 更新 U U U:
U [ i , k : ] = U [ i , k : ] − m i k ⋅ U [ k , k : ] U[i, k:] = U[i, k:] - m_{ik} \cdot U[k, k:] U[i,k:]=U[i,k:]−mik⋅U[k,k:]
- 计算乘数:
1.3 存在性与唯一性
- 条件:当且仅当 A A A 的所有顺序主子式非零时,存在唯一的LU分解。
- 唯一性:若 L L L 是单位下三角矩阵(对角线为1),则分解唯一。
1.4示例(3×3矩阵)
设矩阵 A = [ 2 1 1 4 1 0 − 2 2 1 ] A = \begin{bmatrix} 2 & 1 & 1 \\ 4 & 1 & 0 \\ -2 & 2 & 1 \end{bmatrix} A= 24−2112101 ,其分解过程如下:
1.4.1 第一步( k = 1 k=1 k=1)
- 乘数:
m 21 = 4 2 = 2 m_{21} = \frac{4}{2} = 2 m21=24=2, m 31 = − 2 2 = − 1 m_{31} = \frac{-2}{2} = -1 m31=2−2=−1 - 更新后的 U U U:
U = [ 2 1 1 0 − 1 − 2 0 3 2 ] U = \begin{bmatrix} 2 & 1 & 1 \\ 0 & -1 & -2 \\ 0 & 3 & 2 \end{bmatrix} U= 2001−131−22
1.4.2 第二步( k = 2 k=2 k=2)
- 乘数:
m 32 = 3 − 1 = − 3 m_{32} = \frac{3}{-1} = -3 m32=−13=−3 - 更新后的 U U U:
U = [ 2 1 1 0 − 1