2017-02-10 9 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는 스파이 스 고유 분해 (코드 작성자가 동일한 코드 작성자)에 매우 유사한 기본 코드를 사용하지만 Armadillo에는 단순한 사용자 인터페이스가 있습니다. 아르마딜로를 사용하여 대칭 희소 행렬의 고유 벡터를 계산하려면 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 차원 배열로 구성 될 수있다 : I 문제를 파악

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