Als Teil meiner Pipeline muss ich Eigenkomposition einer großen Matrix in der Größenordnung von 6000x6000 durchführen. Die Matrix ist dicht, also, außer wenn ich das Problem vereinfache (wenn möglich, kann keine spärliche Methode verwendet werden).C++ Große Eigenkompositionsgeschwindigkeit
Im Moment spiele ich mit Spielzeug Daten. Unter Verwendung der Eigen-Bibliothek für eine 513 × 513-Matrix benötige ich ~ 6,5 Sekunden, während für eine 2049 × 2049-Matrix ~ 130 Sekunden benötigt werden, was unerschwinglich klingt, da der Anstieg nicht linear ist. Dies wurde mit Eigen::SelfAdjointEigenSolver
erreicht, während mit anderen Methoden wie Eigen::EigenSolver
oder Eigen::ComplexEigenSolver
habe ich keine nennenswerte Verbesserung erhalten. Dasselbe passierte, als ich Armadillo mit arma::eig_sym
sogar mit der Option "dc" probierte, die ein schnelleres aber ungefähres Ergebnis geben sollte. Armadillo hat einige Methoden, die nur die ersten X Eigenwerte zur Beschleunigung zurückgeben, aber dies ist nur für spärliche Methoden. Im Moment kann ich wahrscheinlich mit den ersten 10-20 Eigenwerten davonkommen.
Gibt es einen Weg oder eine Bibliothek/Methode, die mir eine bemerkenswerte Beschleunigung geben kann?
Wenn Sie nur die wenigen höchsten bzw. kleinsten Eigenvektoren benötigen, dann gibt es effizientere Methoden. – SpamBot
Dies ist genau das, was ich erwähne, dass dies eine gute Problemumgehung sein könnte. Welche sind diese Methoden? Irgendein Zeiger bitte? –
Lapack bietet solche Routinen. Bezüglich Ihrer Zahlen habe ich 7.5s nur für eine 2049x2049-Matrix mit 'Eigen :: SelfAdjointEigenSolver' und 280s für eine 6000x6000-Matrix erhalten. Stellen Sie sicher, dass Sie mit den Compileroptimierungen ON kompiliert haben. Natürlich ist dies immer noch prohibitiv und verwendet besser einen dedizierten Algorithmus, der nur die ersten Eigenvektoren extrahiert. – ggael