我试图尽快地用特征求解稀疏线性系统。
这些文档给您提供了4个稀疏的求解器,它们都来自于(但实际上更像这三个):
SimplicialLLT
#include<Eigen/SparseCholesky> Direct LLt factorization SPD Fill-in reducing LGPL
SimplicialLDLT is often preferable
SimplicialLDLT
#include<Eigen/SparseCholesky> Direct LDLt factorization SPD Fill-in reducing LGPL
Recommended for very sparse and not too large problems (e.g., 2D Poisson eq.)
SparseLU
#include<Eigen/SparseLU> LU factorization Square Fill-in reducing, Leverage fast dense algebra MPL2
optimized for small and large problems with irregular patterns 当我使用最后一个解算器时,即我使用:
Eigen::SparseLU<Eigen::SparseMatrix<Scalar>> solver(bijection);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");
solver.compute(bijection);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");
Eigen::VectorXf vertices_u = solver.solve(u);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");
Eigen::VectorXf vertices_v = solver.solve(v);
Assert(solver.info() == Eigen::Success, "Matrix is degenerate.");我得到了正确的结果,在图形上如下所示:

如果我使用simplicialLDLT,即如果我将求解程序行更改为:
Eigen::SimplicialLDLT<Eigen::SparseMatrix<Scalar>> solver(bijection);我知道这个堕落的怪物:

基本上,对于完全相同的稀疏系统,两个求解者返回的结果是不同的。这怎麽可能?
所有的错误检查都不会返回false,因此在这两个版本中,矩阵都被认为是正确的。
发布于 2022-09-22 13:03:49
https://eigen.tuxfamily.org/dox/group__TopicSparseSystems.html => SimplicialLDLT仅适用于SPD矩阵。您可以尝试使用最小二乘方法https://snaildove.github.io/2017/08/01/positive_definite_and_least_square/
https://stackoverflow.com/questions/69907247
复制相似问题