gpt4 book ai didi

c++ - 当 A=LLt 时求解 Lx=b 和 Px=b

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:14 25 4
gpt4 key购买 nike

我正在使用 Eigen 分解稀疏 SPD 矩阵 A。它将是 LLt 或 LDLt 分解 (Cholesky),因此我们可以假设矩阵将分解为D 对角线(可能是恒等式)。如果我这样做

SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);

要解决 Lx=b 那么执行以下操作是否有效?

solver.matrixL().TriangularView<Lower>().solve(b)

类似地,要解决 Px=b 那么执行以下操作是否有效?

solver.permutationPinv()*b

我想这样做是为了高效稳定地计算bt A-1 b

最佳答案

看看 _solve_impl 是如何为 SimplicialCholesky 实现的。本质上,你可以简单地写:

Eigen::VectorXd x = solver.permutationP()*b; // P not Pinv!
solver.matrixL().solveInPlace(x); // matrixL is already a triangularView

// depending on LLt or LDLt use either:
double res_llt = x.squaredNorm();
double res_ldlt = x.dot(solver.vectorD().asDiagonal().inverse()*x);

请注意,您需要乘以 P 而不是 Pinv,因为A = P^-1 L D L^t P

P^-1 L^-t D^-1 L^-1 P

因为在对乘积求逆时矩阵的顺序会颠倒。

关于c++ - 当 A=LLt 时求解 Lx=b 和 Px=b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49412750/

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