2017-02-10 9 views
0

Ich habe die SymEigsShiftSolver zur Berechnung der Eigenwerte einer großen Sparse Matrix implementiert, aber es ist mir nicht die Eigenvektoren zurückgibt. Wurde es noch nicht implementiert?Ist die SymEigsShiftSolver von Spectra nicht Eigenvektoren zurückkehren?

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; 
} 

Antwort

1

Ich bin nicht sicher, warum Sie den „Gürteltier“ Tag hinzugefügt haben, da Sie die Eigen Bibliothek verwenden. Ich habe die folgende Antwort gegeben, wenn Sie tatsächlich an einer Armadillo basierten Lösung interessiert sind.

Sowohl Armadillo als auch Spectra verwenden einen sehr ähnlichen zugrunde liegenden Code für sparse Eigenkomposition (der Code wurde vom selben Autor geschrieben), aber Armadillo hat eine vereinfachte Benutzeroberfläche. Um die Eigenvektoren einer symmetrischen Sparse Matrix zu berechnen mit Armadillo, verwenden Sie die eigs_sym() Funktion:

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

Wenn Sie eine nicht-symmetrische Matrix haben, die eigs_gen() Funktion kann in ähnlicher Weise verwendet werden:

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 A kann aus einem 1D-Array auf einfache Weise konstruiert werden:

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

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

Danke, das hilft. –

0

I das Problem herausgefunden. Der SymEigsShiftSolver benötigt einen Sigma-Wert von> 0, um die Eigenvektoren zurückzugeben.

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