如何修复 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);
}
我想使用 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);
}