使用 Eigen 中的 Cholesky 方法求解大型稀疏线性系统
Solving a large sparse linear system using Cholesky Method in Eigen
实际上,我正在尝试使用 Eigen 中的 Cholesky 方法求解大型稀疏线性系统。
我从 this site 下载了一个稀疏矩阵 (cfd1)。我试图解决定义如下的线性系统 Ax = b:A 是矩阵 cfd1,b = A * xe,其中 xe 是具有与矩阵行数相同大小的向量。总之,使用 Matlab 符号我想解决:x = A\b
。这里的代码:
#include <iostream>
#include <Eigen/Dense>
#include <unsupported/Eigen/SparseExtra>
#include<Eigen/SparseCholesky>
using namespace std;
using namespace Eigen;
int main()
{
SparseMatrix<double> mat;
VectorXd x;
loadMarket(mat, "Path of downloaded matrix");
cout << "Number of Rows:\n" << mat.rows() << endl;
ArrayXd xe = ArrayXd::Constant(mat.rows(), 1);
cout << xe << endl;
SparseVector<double> b = mat*xe;
SimplicialLLT<SparseMatrix<double> > solver;
x = solver.compute(mat).solve(b);
cout << x << endl;
}
问题是当我编译时得到当前错误:
error: invalid operands to binary expression
('SparseMatrix<double>' and 'Eigen::ArrayXd' (aka 'Array<double, Dynamic,
1>'))
SparseVector<double> b = mat*xe;
~~~^~~
/Users/anto/Desktop/example/eigen-eigen-323c052e1731/Eigen/src/SparseCore/../plugins/CommonCwiseBinaryOps.h:50:29:
note:
candidate function template not viable: no known conversion from
'Eigen::ArrayXd' (aka 'Array<double, Dynamic, 1>') to 'const
Eigen::SparseMatrixBase<Eigen::SparseMatrix<double, 0, int>
>::StorageBaseType' (aka 'const
Eigen::SparseMatrixBase<Eigen::SparseMatrix<double, 0, int> >') for 2nd
argument
谁能帮我解决一下?
两件事:
- 您不能在乘积表达式中混用
Array
和 Matrix
,即用 VectorXd
替换 ArrayXd
。
- 稀疏矩阵与稠密向量的乘积通常是稠密的,因此您需要将乘积分配给稠密的
VectorXd
而不是 SparseVector
以下编译
SparseMatrix<double> mat;
loadMarket(mat, "Path of downloaded matrix");
cout << "Number of Rows:\n" << mat.rows() << endl;
VectorXd xe = VectorXd::Constant(mat.rows(), 1);
cout << xe << endl;
VectorXd b = mat*xe;
SimplicialLLT<SparseMatrix<double> > solver;
VectorXd x = solver.compute(mat).solve(b);
cout << x << endl;
实际上,我正在尝试使用 Eigen 中的 Cholesky 方法求解大型稀疏线性系统。
我从 this site 下载了一个稀疏矩阵 (cfd1)。我试图解决定义如下的线性系统 Ax = b:A 是矩阵 cfd1,b = A * xe,其中 xe 是具有与矩阵行数相同大小的向量。总之,使用 Matlab 符号我想解决:x = A\b
。这里的代码:
#include <iostream>
#include <Eigen/Dense>
#include <unsupported/Eigen/SparseExtra>
#include<Eigen/SparseCholesky>
using namespace std;
using namespace Eigen;
int main()
{
SparseMatrix<double> mat;
VectorXd x;
loadMarket(mat, "Path of downloaded matrix");
cout << "Number of Rows:\n" << mat.rows() << endl;
ArrayXd xe = ArrayXd::Constant(mat.rows(), 1);
cout << xe << endl;
SparseVector<double> b = mat*xe;
SimplicialLLT<SparseMatrix<double> > solver;
x = solver.compute(mat).solve(b);
cout << x << endl;
}
问题是当我编译时得到当前错误:
error: invalid operands to binary expression ('SparseMatrix<double>' and 'Eigen::ArrayXd' (aka 'Array<double, Dynamic, 1>')) SparseVector<double> b = mat*xe; ~~~^~~ /Users/anto/Desktop/example/eigen-eigen-323c052e1731/Eigen/src/SparseCore/../plugins/CommonCwiseBinaryOps.h:50:29: note: candidate function template not viable: no known conversion from 'Eigen::ArrayXd' (aka 'Array<double, Dynamic, 1>') to 'const Eigen::SparseMatrixBase<Eigen::SparseMatrix<double, 0, int> >::StorageBaseType' (aka 'const Eigen::SparseMatrixBase<Eigen::SparseMatrix<double, 0, int> >') for 2nd argument
谁能帮我解决一下?
两件事:
- 您不能在乘积表达式中混用
Array
和Matrix
,即用VectorXd
替换ArrayXd
。 - 稀疏矩阵与稠密向量的乘积通常是稠密的,因此您需要将乘积分配给稠密的
VectorXd
而不是SparseVector
以下编译
SparseMatrix<double> mat;
loadMarket(mat, "Path of downloaded matrix");
cout << "Number of Rows:\n" << mat.rows() << endl;
VectorXd xe = VectorXd::Constant(mat.rows(), 1);
cout << xe << endl;
VectorXd b = mat*xe;
SimplicialLLT<SparseMatrix<double> > solver;
VectorXd x = solver.compute(mat).solve(b);
cout << x << endl;