복잡한 희소 행렬 A에 대한 Armadillo eigs_sym (A, k)

Aug 20 2020

희소 행렬 'A'의 가장 작은 고유 값 10 개를 찾으려면 아래 최소 코드가 잘 작동합니다.

g++ -std=c++17  -o test_sparse.o -c test_sparse.cpp
g++ -std=c++17  -o myapp test_sparse.o -larmadillo -larpack
#include <armadillo>
#include <iostream>
int main(){
    arma::SpMat<double> A = arma::sprandu(100,100,0.1) ;
    A = A.t()*A ;
    arma::dvec e = arma::eigs_sym(A,10,"sm") ;
    std::cout << e ; 
    return 0 ;
}

그러나 A를 다음과 같이 복잡한 희소 행렬로 변경하면

#include <armadillo>
#include <iostream>
#include <complex>
int main(){
    arma::SpMat<arma::cx_double> A = arma::sprandu<arma::SpMat<arma::cx_double>>(100,100,0.1) ;
    A = A.t()*A ;
    arma::dvec e = arma::eigs_sym(A,1,"sm") ;
    std::cout << e ; 
    return 0 ;
}

동일한 컴파일 플래그를 사용하면 다음과 같은 일치하지 않는 함수 오류가 발생합니다.

g++ -std=c++17  -o test_sparse.o -c test_sparse.cpp
test_sparse.cpp:8:43: error: no matching function for call to ‘eigs_sym(arma::SpMat<std::complex<double> >&, int, const char [3])’
    8 |     arma::dvec e = arma::eigs_sym(A,1,"sm") ;                    ^
make: *** [Makefile:47: test_sparse.o] Error 1

나는 알고있다 http://arma.sourceforge.net/docs.html#config_hpp 그

ARMA_USE_ARPACK ARPACK의 사용 또는 ARPACK의 고속 교체를 활성화합니다. Armadillo는 복잡한 희소 행렬의 고유 분해를 위해 ARPACK이 필요합니다. eigs_gen (), eigs_sym () 및 svds ()

그래서 config.hpp 파일을 변경하고 여기에 내 config.hpp파일 의 해당 줄이 있습니다.

#if !defined(ARMA_USE_NEWARP)
#define ARMA_USE_NEWARP
#endif
#if !defined(ARMA_USE_ARPACK)
#define ARMA_USE_ARPACK
#endif
#if !defined(ARMA_USE_SUPERLU)
#define ARMA_USE_SUPERLU
#endif

추가 정보 : gfortran에서 문제없이 arpack을 실행할 수 있습니다.

트릭을 수행하는 방법을 아십니까? 미리 도와 주셔서 감사합니다.

답변

francesco Aug 20 2020 at 17:43

이는 라이브러리의 고유 한 제한 사항입니다. 문서 에 따르면 (강조 내) :

eigs_sym 제한된 수의 고유 값 및 희소 대칭 실수 행렬의 고유 벡터

eigs_gen 제한된 수의 고유 값 및 희소 일반 정사각형 행렬의 고유 벡터

오히려 eigs_gen복잡한 행렬을 허용하는 것을 사용해야합니다 . 또는 행렬을 조밀 한 행렬로 변환하고 eig_sym.