犰狳C++;LU分解 < >我使用ARMADILO C++库求解中/大尺寸线性系统(100-5000个方程)。p>

犰狳C++;LU分解 < >我使用ARMADILO C++库求解中/大尺寸线性系统(100-5000个方程)。p>,c++,linear-algebra,numeric,armadillo,decomposition,C++,Linear Algebra,Numeric,Armadillo,Decomposition,因为我要解不同的线性系统 AX=b 其中A总是相同的,B是变化的,我只想对A进行一次LU分解,并将LU分解与不同的B重复使用。不幸的是,我不知道如何在犰狳中进行这种行动 我所做的只是矩阵的LU分解: arma::mat A; // ... fill the A matrix ... arma::mat P,L,U; arma::lu(L, U, P, A); 但是现在我想用矩阵p,L和U来解几个具有不同b向量的线性系统 你能帮我吗?因为A=p.t()*L*U(由于舍入误差,等式只是近似值),所

因为我要解不同的线性系统

AX=b

其中A总是相同的,B是变化的,我只想对A进行一次LU分解,并将LU分解与不同的B重复使用。不幸的是,我不知道如何在犰狳中进行这种行动

我所做的只是矩阵的LU分解:

arma::mat A;
// ... fill the A matrix ...
arma::mat P,L,U;
arma::lu(L, U, P, A);
但是现在我想用矩阵p,L和U来解几个具有不同b向量的线性系统

你能帮我吗?

因为
A=p.t()*L*U
(由于舍入误差,等式只是近似值),所以在
p.t()*L*U*x=b
中求解
x
需要排列
b
的行,并执行前后替换:

x = solve(trimatu(U), solve(trimatl(L), P*b) );
由于犰狳中缺少真正的三角形解算器,并且没有执行行置换的快速方法,相对于直接调用相关的计算拉巴克子例程而言,此过程将不是非常有效

一般建议是避免在高级库(如armadillo)中进行显式LU分解

  • 如果同时知道所有不同的
    b
    ,则将它们作为列存储在矩形矩阵
    b
    X=solve(a,b)中
  • 如果每次已知一个不同的
    b
    ,则预计算
    AINV=a.i()
    x=AINV*b将更有效。以类似的方式看待这一点

  • 也许你可以告诉我们你已经试过什么了?也许你可以编辑你的问题,包括你的尝试的一部分?谢谢Joachim,我添加了我所尝试的。。。