decomposition可以创建一个可重复使用的分解,例如LU,LDL,QR等使得求解Ax=b更加高效。
例如:
dA = decomposition(A) %
dA\b % 与普通求解方程通用的调用格式
可以得到与A\b
相同的结果,但是这样求解速度更快。
对于需要重复求解的情况,这样的操作更加提高计算效率。
dA的使用方式:
- 转置:
dA'
- 乘以负数
-dA
- 乘以系数 c*dA 或者
dA/c.
- 求解线性系统 Ax = b ,
x = dA\b.
- 求解线性系统 xA = b ,
x = b/dA.
实例:
n = 1e3;
rng default % for reproducibility
A = sprandn(n,n,0.2) + speye(n);
x1 = randn(n,1);
x2 = x1;
利用逆法求解1000阶稀疏阵特征值
tic
for ii=1:100
x1 = A \ x1;
x1 = x1 / norm(x1);
end
toc
lambda = x1'*A*x1 % 特征值
耗费时间15s.
lambda = -0.6707
利用decomposition,
tic
dA = decomposition(A);
for ii=1:100
x2 = dA \ x2;
x2 = x2 / norm(x2);
end
toc
lambda = x2'*A*x2
耗费时间:1s。
lambda = -0.6707
小结:
虽然matlab左乘会调用LU分解,但是由于每次循环都需要进行分解,总的来说,浪费了大量的计算时间。利用decomposition可以对代码不修改的基础上达到计算效率大幅提高的目的。
实际使用过程中,针对所求矩阵的特性选择不同类型的分解,可以使得计算更加高效。