如何修复 Eigen::NaturalOrdering<int> >::MatrixType' 没有名为 'isCompressed' 的成员

How to Fix Eigen::NaturalOrdering<int> >::MatrixType' has no member named 'isCompressed'

我想使用 SparseQR 或 SparseLU 方法求解具有稀疏矩阵的线性系统。为此,我正在使用 Eigen 库。问题是这种方法会给出错误代码不起作用。 我正在使用 MinGW 编译器

在 Eclipse C++ 中编程

我使用了 Eigen 库中的 bicgstab 方法并且它正在运行,但现在使用稀疏方法出现错误。

这是我想用于求解线性系统的代码,只需更改方法名称和它适用于其他方法的参数之一,但不适用于稀疏方法

SparseQR<MatrixXd, NaturalOrdering<int>> solver;
solver.analyzePattern(A);
solver.factorize(A);
x = solver.solve(y);

x、A 和 y 属于 class MatrixXd。

这段代码适用于方法bicgstab,语法是一样的。问题是出现如下错误:

src\/src/SparseQR/SparseQR.h:381:66: error: 'const class
Eigen::SparseQR<Eigen::Matrix<double, -0x000000001,
-0x000000001>,Eigen::NaturalOrdering<int> >::MatrixType' has no member named 'isCompressed'

src\/src/SparseQR/SparseQR.h:381:66: error: 'const class
Eigen::SparseQR<Eigen::Matrix<double, -0x000000001,
-0x000000001>,Eigen::NaturalOrdering<int> >::MatrixType' has no member named 'outerIndexPtr'

我不知道热修复。

如果您有任何可能的解决方案,我将不胜感激。感谢您的宝贵时间

如评论中所述,SparseQR 仅适用于稀疏矩阵。如果出于某种原因您的输入矩阵 A 作为密集矩阵传递,您可以使用 A.sparseView() 转换它,但您应该首先将它存储为(压缩的)稀疏矩阵。还要注意 SparseQR 的模板参数必须是 SparseMatrix:

void foo(Eigen::MatrixXd const &A, Eigen::VectorXd const &y, Eigen::VectorXd& x)
{
    Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::NaturalOrdering<int> > solver;
    solver.compute(A.sparseView());
    x = solver.solve(y);
}

如果您的矩阵 A 实际上是稠密的(或 "not very sparse"),通常只使用稠密求解器会更有效,例如

void foo(Eigen::MatrixXd const &A, Eigen::VectorXd const &y, Eigen::VectorXd& x)
{
    Eigen::FullPivHouseholderQR<Eigen::MatrixXd> solver;
    solver.compute(A);
    x = solver.solve(y);
}