SymEigsShiftSolver of Spectra不会返回特征向量吗?

时间:2017-02-10 05:03:40

标签: 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;
}

2 个答案:

答案 0 :(得分:1)

我不确定为什么你添加了“armadillo”标签,因为你正在使用特征库。如果您确实对基于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

可以用简单的方式从一维数组构建sparse matrix

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

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

答案 1 :(得分:0)

我想出了这个问题。 SymEigsShiftSolver需要sigma值> 0才能返回特征向量。

 SymEigsShiftSolver< double, SMALLEST_MAGN, SparseSymShiftSolve<double> >
            eigs(&op, k, 4, 1.0);