Jako część mojego potoku muszę wykonać rozkład złożony z dużej matrycy rzędu 6000x6000. Matryca jest gęsta, więc chyba, że uprościłem problem (w miarę możliwości sot), nie można zastosować żadnej rzadkiej metody.C++ Duża prędkość rozkładania w eigendach
W tej chwili gram z danymi o zabawkach. Używanie biblioteki Eigen dla macierzy 513x513 potrzebuje ~ 6,5 sekundy, podczas gdy dla matrycy 2049x2049 potrzebuję ~ 130 sekund, co brzmi wygórnie, ponieważ wzrost nie jest liniowy. Zostało to osiągnięte dzięki Eigen::SelfAdjointEigenSolver
, podczas gdy innymi metodami, takimi jak Eigen::EigenSolver
lub Eigen::ComplexEigenSolver
, nie dostałem zauważalnej poprawy. To samo stało się, gdy wypróbowałem Armadillo z arma::eig_sym
nawet z opcją "dc", która ma dać szybszy, ale przybliżony wynik. Armadillo ma kilka metod, które zwracają tylko pierwsze X wartości własnych dla przyspieszenia, ale jest to tylko dla rzadkich metod. W tej chwili prawdopodobnie mogę uciec z pierwszych 10-20 wartości własnych.
Czy istnieje sposób lub biblioteka/metoda, która może dać mi godne przyspieszenie?
Jeśli potrzebujesz tylko kilku najwyższych lub najmniejsze wektory własne, to nie są bardziej skuteczne metody. – SpamBot
To jest dokładnie to, o czym wspomniałem, że może to być wystarczająco dobrym rozwiązaniem. Jakie są te metody? Jakikolwiek wskaźnik, proszę? –
Lapack zapewnia takie procedury. Jeśli chodzi o twoje liczby, uzyskałem 7,5s tylko dla matrycy 2049x2049 przy użyciu 'Eigen :: SelfAdjointEigenSolver' i 280s dla matrycy 6000x6000. Upewnij się, że kompilujesz przy włączonych optymalizacjach kompilatora. Oczywiście nadal jest to wygórowane i lepiej wykorzystywać dedykowany algorytm wyodrębniający tylko pierwsze wektory własne. – ggael