犰狳 C++ LU 分解

Posted

技术标签:

【中文标题】犰狳 C++ LU 分解【英文标题】:Armadillo C++ LU decomposition 【发布时间】:2013-07-30 07:23:56 【问题描述】:

我正在使用 Armadillo C++ 库来求解中/大尺寸的线性系统(1000-5000 个方程)。

因为我必须解决不同的线性系统

AX=b

其中 A 始终相同而 B 发生变化,我只想对 A 进行一次 LU 因式分解,然后用不同的 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 向量的几个线性系统。

你能帮帮我吗?

【问题讨论】:

也许您可以告诉我们您已经尝试过什么?也许您可以编辑您的问题以包含您尝试的SSCCE? 感谢 Joachim,我添加了我尝试过的内容... 【参考方案1】:

由于A = P.t()*L*U(由于舍入误差,相等仅是近似值),求解P.t()*L*U*x = b 中的x 需要置换B 的行并执行正向和反向替换:

x = solve(trimatu(U), solve(trimatl(L), P*b) );

由于犰狳中缺乏真正的三角求解器,以及执行行置换的快速方法,因此相对于直接调用相关的计算 LAPACK 子例程而言,此过程效率不高。

一般建议是避免在更高级别的库(如犰狳)中进行显式 LU 分解。

    如果同时知道所有不同的b,则将它们作为列存储在矩形矩阵BX = solve(A,B); 中 如果不同的b 一次是已知的,那么如果不同r.h.s 的数量不同,预计算AINV = A.i();x = AINV*b; 会更有效。向量足够大。看到这个answer 到一个类似的question。

【讨论】:

以上是关于犰狳 C++ LU 分解的主要内容,如果未能解决你的问题,请参考以下文章

在犰狳 C++ 中为复杂特征值分解找到不同的值

如何在 Eigen C++ 中加速 LU 分解?

C++ Eigen LU 分解 - 行列式的符号

犰狳 eigs_sym:分解失败

矩阵的lu分解及应用

矩阵的LU分解