2017-02-10 3 views
0

大規模な疎行列の固有値を計算するためにSymEigsShiftSolverを実装しましたが、固有ベクトルは返しません。まだ実装されていないのですか?Spectraの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; 
} 

答えて

1

なぜあなたは固有ライブラリを使用しているので、「armadillo」タグを追加したのか分かりません。実際にArmadilloベースのソリューションに興味がある場合は、以下の応答を提供しました。

ArmadilloとSpectraの両方で、疎な固有分解のための非常によく似た基礎コードを使用します(このコードは同じ著者が書いたものですが)。アルマジロを使用して、対称スパース行列の固有ベクトルを計算するには、eigs_sym()機能を使用します。

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 
:あなたは非対称行列を持っている場合は、 eigs_gen()機能も同様に使用することができます

// 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 

sparse matrixは、簡単な方法で1次元アレイから構成することができる:私はこの問題を考え出し

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

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

ありがとうございます。 –

0

。 SymEigsShiftSolverは固有ベクトルを返すためにシグマ値> 0を必要とします。

SymEigsShiftSolver< double, SMALLEST_MAGN, SparseSymShiftSolve<double> > 
      eigs(&op, k, 4, 1.0); 
関連する問題