जटिल विरल मैट्रिक्स ए के लिए आर्माडिलो ईग्स_सिम (ए, के)
स्पार्स मैट्रिक्स 'ए' के 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 के लिए एक उच्च गति प्रतिस्थापन का उपयोग सक्षम करें। अर्माडिलो को जटिल विरल मैट्रिस के ईजन अपघटन के लिए 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 चला सकते हैं।
किसी भी विचार चाल कैसे करना है? आपकी सहायता के लिए अग्रिम रूप से धन्यवाद।
जवाब
यह पुस्तकालय की एक अंतर्निहित सीमा है। प्रलेखन के अनुसार (जोर मेरा):
eigs_sym सीमित संख्या में eigenvalues और विरल सममित असली मैट्रिक्स के eigenvectors
eigs_gen सीमित सामान्य वर्ग मैट्रिक्स के eigenvalues और eigenvectors की सीमित संख्या
आपको इसके बजाय eigs_genजटिल मैट्रेस के लिए उपयोग करना चाहिए । या आपको मैट्रिक्स को घने में बदलना चाहिए और उपयोग करना चाहिए eig_sym।