eigen — C ++ Spectra с разреженной матрицей RowMajor

Я пытаюсь использовать библиотеку Spectra 3.5 на моем компьютере с Linux, и оболочка SparseGenMatProd для умножения Matrix-Vector, похоже, работает только тогда, когда разреженная матрица имеет формат ColMajor. Это нормальное поведение, и если да, то как я могу исправить это, чтобы принять формат 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

Решение

API SparseGenMatProd кажется, вводит в заблуждение. Похоже, вы должны указать, что имеете дело с матрицами основных строк через второй параметр шаблона:

SparseGenMatProd<double,RowMajor> op(M);

иначе M неявно преобразуется во временную основную матрицу столбца, которая затем сохраняется по константной ссылке op но этот временный мертвый сразу после этой строки кода.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]