Armadillo eigs_sym(A,k) für komplexe dünne Matrix A
Um den 10 kleinsten Eigenwert einer dünnen Matrix 'A' zu finden, funktioniert der folgende minimale Code gut:
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 ;
}
Aber wenn ich A in eine komplexe Sparse-Matrix ändere, wie:
#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 ;
}
Mit den gleichen Kompilierungsflags erhalte ich den folgenden Fehler ohne übereinstimmende Funktion:
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
Ich weiß vonhttp://arma.sourceforge.net/docs.html#config_hppdas
ARMA_USE_ARPACK Aktivieren Sie die Verwendung von ARPACK oder einen Hochgeschwindigkeitsersatz für ARPACK. Armadillo benötigt ARPACK für die Eigenzerlegung komplexer dünner Matrizen, dh. eigs_gen(), eigs_sym() und svds()
Also ändere ich die Datei config.hpp und hier ist die entsprechende Zeile in meiner config.hppDatei:
#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
Weitere Informationen: Ich kann arpack problemlos von gfortran ausführen.
Irgendeine Idee, wie man den Trick macht? Danke im Voraus für Ihre Hilfe.
Antworten
Es ist eine inhärente Einschränkung der Bibliothek. Laut Dokumentation (Hervorhebung von mir):
eigs_sym begrenzte Anzahl von Eigenwerten und Eigenvektoren einer spärlichen symmetrischen reellen Matrix
eigs_gen begrenzte Anzahl von Eigenwerten und Eigenvektoren einer spärlichen allgemeinen quadratischen Matrix
Verwenden Sie lieber eigs_gendie, die komplexe Matrizen zulässt. Oder Sie sollten die Matrix in eine dichte Matrix umwandeln und verwenden eig_sym.