我无法让Eigen::SparseQR求解器适用于矩形矩阵,应该支持矩阵矩阵。 这是尝试解决Ax = b:
的最小示例#include <iostream>
#include <Eigen/Sparse>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{
const Triplet<double> A_triplets[] = { { 0,0,1 },{ 1,1,1 },{ 2,1,2 } };
const Triplet<double> b_triplets[] = { { 0,0,1 },{ 1,0,2 },{ 2,0,4 } };
SparseMatrix<double> A(3, 2);
SparseMatrix<double> b(3, 1);
A.setFromTriplets(&A_triplets[0], &A_triplets[3]);
b.setFromTriplets(&b_triplets[0], &b_triplets[3]);
cout << "A=\n" << A.toDense() << '\n';
cout << "b=\n" << b.toDense() << '\n';
SparseQR<SparseMatrix<double>, COLAMDOrdering<SparseMatrix<double>::StorageIndex>> solver;
solver.compute(A);
SparseMatrix<double> x = solver.solve(b);
cout << "x=\n" << x.toDense() << '\n';
system("pause");
return 0;
}
其输出为:
A=
1 0
0 1
0 2
b=
1
2
4
Assertion failed: rows == this->rows() && cols == this->cols() && "DenseBase::resize() does not actually allow to resize.", file <Eigen directory>\densebase.h, line 257
compute
调用成功完成,但solve
没有成功完成。这似乎不是方形矩阵的问题。此外,使用Eigen::LeastSquaresConjugateGradient解算器可以正常工作。
我使用VS15和各种3.3.x版本的Eigen构建了它,所有这些都具有相同的结果。我还尝试了解算器工作的旧版本3.2.10,但是出现了内存问题,例如,x.nonZeros()
返回带有元素(1,2,-6.27744e + 66)的3,尽管x是2x1矩阵。 / p>
有人能提供这方面的见解吗?