A = LU

这实际上就是我们解矩阵方程组一般使用的方式,比如方程组是:
我们一般把它写成增广矩阵:
然后化简成阶梯型矩阵的形式,这个时候可以方便的算出
,然后再往上代回,逐渐得到所有的x。
如果我们实际来 coding,可能会出现的问题:
为0, 或者
,那么我们化简第二行时
可能会误差很大
解决的办法就是行交换,把比较大的pivot放在前面。其实这个我们手动解
的时候就会这样做。
这个方法叫做 Gaussian elimination with partial pivoting (GEPP). 实际上 Matlab 中用的一般也就是这个办法来解
, 当然在 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=[12-3;-3-11;1-11];>>[L,U]=lu(A)L=-0.33331.000001.000000-0.3333-0.80001.0000U=-3.0000-1.00001.000001.6667-2.666700-0.8000>>[L,U,P]=lu(A)L=1.000000-0.33331.00000-0.3333-0.80001.0000U=-3.0000-1.00001.000001.6667-2.666700-0.8000P=010100001

A = QR

Q 代表的是正交矩阵,这里的 R 是upper triangle 矩阵:
>>[Q,R]=qr(A)Q=-0.3015-0.76750.56570.9045-0.04260.4243-0.30150.63960.7071R=-3.3166-1.20601.50760-2.13202.899500-0.5657
我们可以通过 Gram–Schmidt 完成 QR 分解。
正交矩阵当然是具有很多很好特性的矩阵,比如:
det(Q) = ±1, 如果 det(Q) = 1 则为旋转变换,说起旋转变换又会想到SO(n) 李群和李代数可以给我们提供一组正交基
当矩阵是一个实对称矩阵S(symmetric)的时候,我们可以把它分解成:
正交矩阵Q、 对角矩阵Λ(特征值)、正交矩阵的转置
。
这个分解叫特征分解(Eigendecomposition),又称谱分解(Spectral decomposition),因为 Q 中是特征向量, Λ 中是特征值,
是跟
这些特征值对应的特征向量。
当然在 Matlab中我们还是用 [V, D] = eig(S) 可以得到它的对应矩阵 Q 和Λ.
>>A=[145;426;563];>>issymmetric(A)ans=logical1>>[V,D]=eig(A)V=0.31300.80960.49660.5774-0.57740.5774-0.7541-0.10600.6481D=-3.6687000-2.507300012.1760
Matlab 中使用:
>>[U,S,V]=svd(A)U=-0.7795-0.42140.46340.6107-0.67600.41250.13940.60450.7843S=4.58070002.62800000.3323V=-0.53970.84130.0309-0.5041-0.2936-0.81220.67430.4539-0.5825
Cholesky分解,当A是一个SPD (real Symmetric positive definite matrix)的时候,我们可以把它分解成 lower triangle 矩阵 L 和它的转置也就是 upper triangle
.
>>A=[412-16;1237-43;-16-4398];>>R=chol(A)R=26-8015003>>R'*Rans=412-161237-43-16-4398
如果 A 可以对角化,那么 A 可以分解成
。 依旧可以使用特征值分解来解决这个问题。