具有RowMajor稀疏矩阵的C ++光谱

时间:2018-08-22 17:20:36

标签: c++ eigen spectra

我正在尝试在Linux机器上使用Spectra 3.5库,并且当稀疏矩阵为ColMajor格式时,用于Matrix-Vector乘法的SparseGenMatProd包装器似乎才起作用。这是正常现象吗,如果是这样,我如何将其修复为RowMajor格式?我提供了一个基本示例,其中输出为“分段错误(核心已转储)”。我浏览了其他几篇文章和文档,但似乎找不到答案。

#include <Eigen/Core>
#include <Eigen/SparseCore>
#include <GenEigsSolver.h>
#include <MatOp/SparseGenMatProd.h>
#include <iostream>

using namespace Spectra;

int main()
{
    // A band matrix with 1 on the main diagonal, 2 on the below-main subdiagonal,
    // and 3 on the above-main subdiagonal
    const int n = 10;
    Eigen::SparseMatrix<double, Eigen::RowMajor> M(n, n);
    M.reserve(Eigen::VectorXi::Constant(n, 3));
    for(int i = 0; i < n; i++)
    {
        M.insert(i, i) = 1.0;
        if(i > 0)
            M.insert(i - 1, i) = 3.0;
        if(i < n - 1)
            M.insert(i + 1, i) = 2.0;
    }

    // Construct matrix operation object using the wrapper class SparseGenMatProd
    SparseGenMatProd<double> op(M);

    // Construct eigen solver object, requesting the largest three eigenvalues
    GenEigsSolver< double, LARGEST_MAGN, SparseGenMatProd<double> > eigs(&op, 3, 6);

    // Initialize and compute
    eigs.init();
    int nconv = eigs.compute();

    // Retrieve results
    Eigen::VectorXcd evalues;
    if(eigs.info() == SUCCESSFUL)
        evalues = eigs.eigenvalues();

    std::cout << *emphasized text*"Eigenvalues found:\n" << evalues << std::endl;

    return 0;
}

如果将第15行更改为:

Eigen::SparseMatrix<double, Eigen::ColMajor> M(n, n);

它将按预期工作。

当前,我正在解决这个问题,并将矩阵转换为ColMajor,但我想了解发生了什么。任何帮助深表感谢。

1 个答案:

答案 0 :(得分:1)

SparseGenMatProd的API似乎颇具误导性。看起来您必须通过第二个模板参数指定要处理的是行优先矩阵:

SparseGenMatProd<double,RowMajor> op(M);

否则,M被隐式转换为临时的以列为主的矩阵,然后由op通过const引用存储,但是此临时在代码行之后立即失效。