Я долго пытался придумать алгоритм для параллельной декомпозиции собственных значений, но ни один из алгоритмов, которые я пробовал, не может превзойти алгоритм eig Matlab, так что есть ли кто-нибудь, кто знает, какой алгоритм использует Matlab для функции eig? или кто-нибудь может предложить мне хороший параллельный алгоритм для разложения собственных значений?
Параллельное разложение собственных значений Matlab
Ответы (2)
MATLAB использует LAPACK для своей линейной алгебры более высокого уровня. Согласно команде версии MATLAB, это библиотека математического ядра Intel (MKL):
>> version('-lapack')
ans =
Intel(R) Math Kernel Library Version 11.0.2 Product Build 20130124 for Intel(R) 64 architecture applications
Linear Algebra PACKage Version 3.4.1
Intel MKL включает очень быстрые реализации BLAS и LAPACK, но не является бесплатным. Для вариантов с открытым исходным кодом попробуйте Eigen и Броненосец. Их API очень интуитивно понятен, и они довольно быстрые. И если вы верите заявлениям Эйгена, они самые быстрые открытый BLAS доступен с превосходным API по сравнению с эталонным netlib LAPACK (IMO, утверждение API довольно очевидно, если вы посмотрите на версию Fortran!)
Вы можете использовать Armadillo с OpenBLAS. Оба с открытым исходным кодом. Последние версии OpenBLAS также предоставляют функции LAPACK. OpenBLAS использует несколько ядер (т.е. работает параллельно).
При использовании функции Armadillo eig_sym() укажите, что метод "разделяй и властвуй" использоваться. Это имеет большое значение для больших матриц. Например:
eig_sym(eigval, eigvec, X, "dc")
Кстати, вы также можете связать код на основе Armadillo с Intel MKL вместо OpenBLAS. MKL также предоставляет оптимизированные функции LAPACK.