Spectra 的 SymEigsShiftSolver 不是 return 特征向量吗?
Does the SymEigsShiftSolver of Spectra not return eigenvectors?
我已经实现了 SymEigsShiftSolver 来计算大型稀疏矩阵的特征值,但是它 return 我没有计算特征向量。到现在还没有实施吗?
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" 标签,因为您使用的是特征库。如果您确实对基于 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
如果你有一个 non-symmetric 矩阵,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) );
我想通了。 SymEigsShiftSolver 需要大于 0 的 sigma 值才能 return 特征向量。
SymEigsShiftSolver< double, SMALLEST_MAGN, SparseSymShiftSolve<double> >
eigs(&op, k, 4, 1.0);
我已经实现了 SymEigsShiftSolver 来计算大型稀疏矩阵的特征值,但是它 return 我没有计算特征向量。到现在还没有实施吗?
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" 标签,因为您使用的是特征库。如果您确实对基于 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
如果你有一个 non-symmetric 矩阵,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) );
我想通了。 SymEigsShiftSolver 需要大于 0 的 sigma 值才能 return 特征向量。
SymEigsShiftSolver< double, SMALLEST_MAGN, SparseSymShiftSolve<double> >
eigs(&op, k, 4, 1.0);