Boru hattımın bir parçası olarak, 6000x6000 sırasına göre büyük bir matrisin eigendüzenleştirmesini gerçekleştirmem gerekiyor. Matris yoğun, yani problemi basitleştirmem (mümkünse emin olun) haricinde herhangi bir seyrek yöntem kullanılamaz.C++ Büyük eigendeksleme hızı
Şu anda oyuncak verileriyle oynuyorum. Bir 513x513 matrisi için Eigen kütüphanesini kullanarak ~ 6,5 saniyeye ihtiyacım var, 2049x2049 matrisi için ise ~ 130 saniyeye ihtiyacım var, bu da lineer olmadığı için engelleyici geliyor. Bu, Eigen::EigenSolver
veya Eigen::ComplexEigenSolver
gibi diğer yöntemlerle kayda değer bir iyileşme elde edemediğinde Eigen::SelfAdjointEigenSolver
ile elde edildi. Aynı şey Armadillo'yu arma::eig_sym
ile denediğimde, daha hızlı ancak yaklaşık bir sonuç vermesi beklenen "dc" seçeneği ile bile oldu. Armadillo'nun hızlandırmak için sadece ilk X özdeğerini veren bazı yöntemleri vardır, ancak bu sadece seyrek yöntemler içindir. Şu anda muhtemelen ilk 10-20 özdeğerleri ile kaçabilirim.
Bana önemli bir hız kazandırabilecek bir yol veya kütüphane/yöntem var mı?
:
Örnek kod büyük ve en küçük 10 özdeğer gibi görünebilir hesaplamak için. – SpamBot
Tam olarak söylediğim şey, bunun yeterince iyi bir çözüm olabileceğidir. Bu yöntemler hangileri? Herhangi bir işaretçi lütfen? –
Lapack, bu gibi yordamları sağlar. Rakamlarla ilgili olarak, sadece Eee :: SelfAdjointEigenSolver' kullanarak 2049x2049 matris için 7.5s ve 6000x6000 matris için 280s elde ettim. Derleyici optimizasyonları ON ile derlenmiş olduğundan emin olun. Tabii ki, bu hala engelleyici ve sadece ilk özvektörleri ayıklayan özel bir algoritma kullanmaktadır. – ggael