我使用名为Spectra
的库来计算Eigen
稀疏矩阵的特征值。包提供的sample code表示我们应该这样做:
// 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, 30);
// Initialize and compute
eigs.init();
int nconv = eigs.compute();
// Retrieve results
Eigen::VectorXcd evalues;
if(eigs.info() == SUCCESSFUL)
evalues = eigs.eigenvalues();
在上面和下面的代码摘录中,M
是Eigen::SparseMatrix<double>
。但是,我的稀疏矩阵非常大,会占用大量内存。使用示例代码会导致分段错误。因此,我必须通过执行以下操作在堆上创建矩阵操作对象:
SparseGenMatProd<double>* op = new SparseGenMatProd<double>(M);
// Construct eigen solver object, requesting the smallest three eigenvalues
GenEigsSolver< double, SMALLEST_MAGN, SparseGenMatProd<double> >* eigs = new GenEigsSolver< double, SMALLEST_MAGN, SparseGenMatProd<double> >(op, 3, 30);
// Initialize and compute
eigs->init(); int nconv = eigs->compute();
遗憾的是,这并没有解决问题。我仍然看到分段错误。我不确定是否因为我的矩阵M
太大而我应该通过引用传递它(如果我还没有这样做)。如果是这样,我该怎么做呢?