Come parte della mia pipeline, ho bisogno di eseguire la eigendecomposizione di una grande matrice nell'ordine di 6000x6000. La matrice è densa, quindi a meno che non semplifichi il problema (se possibile sicuro, non è possibile utilizzare alcun metodo sparse).C++ Grande velocità di composizione elettronica
Al momento gioco con dati giocattolo. Usando la libreria Eigen per una matrice 513x513 ho bisogno di ~ 6.5 secondi, mentre per una matrice 2049x2049 ho bisogno di ~ 130 secondi, il che suona proibitivo poiché l'aumento non è lineare. Ciò è stato ottenuto con Eigen::SelfAdjointEigenSolver
, mentre con altri metodi come Eigen::EigenSolver
o Eigen::ComplexEigenSolver
non ho ottenuto miglioramenti notevoli. Lo stesso è accaduto quando ho provato Armadillo con arma::eig_sym
anche con l'opzione "dc" che dovrebbe dare un risultato più veloce ma approssimativo. Armadillo ha alcuni metodi per ritirare solo i primi X autovalori per l'accelerazione, ma questo è solo per i metodi sparsi. Al momento posso probabilmente scappare con i primi 10-20 autovalori.
C'è un modo o una libreria/metodo che può darmi una notevole accelerazione?
Se avete bisogno solo i pochi autovettori più alti o più piccoli, poi ci sono i metodi più efficaci. – SpamBot
Questo è esattamente quello che ho detto, che potrebbe essere una buona soluzione. Quali sono questi metodi? Qualche puntatore per favore? –
Lapack fornisce tali routine. Per quanto riguarda i tuoi numeri, ho ottenuto 7,5 solo per una matrice 2049x2049 usando 'Eigen :: SelfAdjointEigenSolver' e 280 per una matrice 6000x6000. Assicurati di aver compilato le ottimizzazioni del compilatore ON. Naturalmente, questo è ancora proibitivo e meglio usare un algoritmo dedicato che estrae solo i primi autovettori. – ggael