c++ - Spectra 的 SymEigsShiftSolver 不返回特征向量吗?

标签 c++ eigen lapack armadillo eigen3

我已经实现了 SymEigsShiftSolver 来计算大型稀疏矩阵的特征值,但是它没有返回特征向量。到现在还没有实现吗?

void Eigens::computeEigenvectors(Matrices m)
{
SparseSymShiftSolve<double> op(m.Lpl);
SymEigsShiftSolver< double, SMALLEST_MAGN, SparseSymShiftSolve<double> >
            eigs(&op, k, 4, 0.0);
eigs.init();
int nconv = eigs.compute();
VectorXd evalues;
evalues.resize(k);
if(eigs.info() == SUCCESSFUL)
    evalues = eigs.eigenvalues();
cout << "Eigenvalues found:\n" << evalues << endl;
cout <<"\nHere is the matrix whose columns are eigenvectors of the Laplacian Matrix \n"
     <<"corresponding to these eigenvalues: \n"
     <<eigs.eigenvectors()<<endl;
}

最佳答案

我不确定您为什么要添加“ Armadillo ”标签,因为您使用的是 eigen 库。如果您确实对 Armadillo 感兴趣,我会提供以下回复基于解决方案。

Armadillo 和 Spectra 都使用非常相似的底层代码来进行稀疏特征分解(代码由同一作者编写),但 Armadillo 具有简化的用户界面。要使用 Armadillo 计算对称稀疏矩阵的特征向量,请使用 eigs_sym()功能:

// generate sparse symmetric matrix
sp_mat A = sprandu<sp_mat>(5000, 5000, 0.1);
sp_mat B = A.t()*A;

vec eigval;
mat eigvec;

eigs_sym(eigval, eigvec, B, 5);       // find 5 eigenvectors with largest magnitude
eigs_sym(eigval, eigvec, B, 5, "sm"); // find 5 eigenvectors with smallest magnitude

如果你有一个非对称矩阵,eigs_gen()函数可以类似的方式使用:

sp_mat A = sprandu<sp_mat>(5000, 5000, 0.1);  

cx_vec eigval;
cx_mat eigvec;

eigs_gen(eigval, eigvec, A, 5);  // find 5 eigenvalues/eigenvectors

A sparse matrix可以用一种简单的方式从一维数组构造:

double data[nrows * ncols]; // 1D array representation of your matrix

sp_mat X = sp_mat( mat(data, nrows, ncols, false) );

关于c++ - Spectra 的 SymEigsShiftSolver 不返回特征向量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151865/

相关文章:

c++ - Eigen 中的扩展/填充矩阵

c++ - 看似正确的模板代码出错 - 怎么了?

c++ - LAPACKE 特征解不准确。如何改进?

visual-studio-2008 - 为什么我在 Windows 上安装预编译版本的 LAPACK 时会出错?

c++ - 将动态二维数组在 C++ 和 Fortran 之间传递

c++ - C2227 : left of '->send' must point to class/struct/union/generic type

c++ - 如何使用 Visual Studio 在 dll 导出类中使用唯一指针 vector

c++ - 为什么 std::unordered_map::count 上没有 `noexcept` 说明符?

c++ - 从索引 vector 中提取特征子矩阵

c++ - 这段代码在哪里出现段错误?