我正在使用Armadillo C ++库来解决中/大尺寸(1000-5000方程)的线性系统。
因为我必须解决不同的线性系统
AX = B
其中A总是相同而B发生变化,我想将LU分解为A一次并重复使用不同b的LU分解。不幸的是,我不知道如何在犰狳中进行这种操作。
我所做的只是A矩阵的LU分解:
arma::mat A;
// ... fill the A matrix ...
arma::mat P,L,U;
arma::lu(L, U, P, A);
但现在我想使用矩阵P,L和U来求解具有不同b向量的几个线性系统。
你能帮我吗?
答案 0 :(得分:2)
由于A = P.t()*L*U
(由于舍入错误,相等只是近似值),在x
中求解P.t()*L*U*x = b
需要置换B
行并执行前向和后向替换:
x = solve(trimatu(U), solve(trimatl(L), P*b) );
由于犰狳中缺少真正的三角形求解器,以及执行行置换的快速方法,对于直接调用相关的计算LAPACK子例程,此过程效率不高。
一般建议是避免在更高级别的库中进行显式LU分解,例如犰狳。