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

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

本文关键字:gt isCompressed 成员 NaturalOrdering Eigen 何修复 lt int MatrixType      更新时间:2023-10-16

我想使用 SparseQR 或 SparseLU 方法来求解具有稀疏矩阵的线性系统。我正在使用特征库来实现此目的。问题是此方法会给出错误,代码不起作用。 我正在使用 Eclipse C++ 编程,使用 MinGW 编译器

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

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

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

x,A 和 y 属于 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实际上是密集的(或"不是很稀疏"(,那么通常只使用密集求解器会更有效,例如

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);
}