Я новичок в программировании на C++, но у меня есть задача вычислить собственные значения и собственные векторы (стандартная задача на собственные значения Ax=lx) для симметричных матриц (и эрмитовых)) для очень больших матрица размера: биномиальная(L,L/2), где L составляет примерно 18-22. Теперь я тестирую его на машине с 7,7 ГБ оперативной памяти, но в конце концов у меня будет доступ к ПК с 64 ГБ оперативной памяти.
Я начал с Lapack++. В начале мой проект предполагал решить эту проблему только для симметричных вещественных матриц.
Эта библиотека была отличной. Очень быстро и мало потребляет оперативной памяти. Он имеет возможность вычислять собственные векторы и помещать их во входную матрицу A для экономии памяти. Оно работает! Я думал, что Lapack++ eigensolver может работать с эрмитовой матрицей, но по неизвестной причине не может (может быть, я делаю что-то не так). Мой проект развился, и я должен быть в состоянии вычислить и эту задачу для эрмитовых матриц.
Поэтому я попытался изменить библиотеку на библиотеку Armadillo. Он отлично работает, но не так хорош, как Lapack++, который заменяет mat A
всеми eigenvec
, но, конечно, поддерживает эрмитовы матрицы.
Немного статистики для L=14
Lapack++ ОЗУ 126 МБ, время 7,9 с, собственное значение + собственные векторы
Armadillo ОЗУ 216 МБ, время 12 с, собственное значение
Armadillo ОЗУ 396 МБ время 15 с собственное значение + собственные векторы
Давайте произведем расчет: переменная double
составляет около 8B. Моя матрица имеет размер binomial(14,7) = 3432, поэтому в идеальном случае она должна иметь размер 3432^2*8/1024^2 = 89 МБ.
У меня такой вопрос: можно ли изменить или заставить Armadillo делать хороший трюк, как Lapack++? Armadillo использует подпрограммы LAPACK
и BLAS
. Или, может быть, кто-то может порекомендовать другой подход к этой проблеме, используя другую библиотеку?
P.S.: Моя матрица действительно разреженная. Он содержит около 2 * binomial(L,L/2) ненулевых элементов. Я пытался вычислить это с помощью SuperLU
в формате CSC, но это было не очень эффективно, для L = 14 -> RAM 185 МБ, но время 135 с.