gpt4 book ai didi

c++ - Armadillo C++ LU 分解

转载 作者:行者123 更新时间:2023-11-30 04:16:01 24 4
gpt4 key购买 nike

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

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

AX=b

其中 A 始终相同而 B 发生变化,我只想对 A 进行 LU 分解一次,然后再使用具有不同 b 的 LU 分解。不幸的是,我不知道如何在 Armadillo 中执行这种操作。

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

arma::mat A;
// ... fill the A matrix ...
arma::mat P,L,U;
arma::lu(L, U, P, A);

但现在我想用矩阵 P、L 和 U 来求解几个具有不同 b vector 的线性系统。

你能帮帮我吗?

最佳答案

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

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

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

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

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

关于c++ - Armadillo C++ LU 分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17940721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com