Armadillo C ++ LU分解

时间:2013-07-30 07:23:56

标签: c++ linear-algebra numeric armadillo decomposition

我正在使用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向量的几个线性系统。

你能帮我吗?

1 个答案:

答案 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分解,例如犰狳。

  1. 如果同时知道所有不同的b,请将它们存储为矩形矩阵BX = solve(A,B);
  2. 中的列
  3. 如果一次只知道不同的b,那么如果不同的r.h.s.的数量,则预计算AINV = A.i();x = AINV*b;会更有效。向量足够大。请参阅此answer至类似的question