我想使用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是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'
我不知道要修复它。
如果您对可能的解决方案有任何想法,我将不胜感激。谢谢您的时间
答案 0 :(得分:1)
如评论中所述,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);
}