对于矩形矩阵,Eigen :: SparseQR失败

时间:2017-10-20 16:55:05

标签: c++ sparse-matrix eigen

我无法让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>

有人能提供这方面的见解吗?

0 个答案:

没有答案