Я не знаю, какую библиотеку выбрать (для окон): LAPACK ++, Armadillo, IT ++, Eigen или, может быть, что-то еще?
Все, что мне нужно сделать, это проверить, является ли большая (около 10 000 * 10 000) матрица диагонализуемой, и, если это так, получить диагональ и обратимую матрицу, такую, что D = (P ^ (- 1)) * A * P. Это должно быть сделано как можно быстрее. Я понятия не имею, какую библиотеку использовать.
Кроме того, я буду рад узнать, каковы плюсы и минусы каждой из этих библиотек.
Это может быть довольно расплывчатый ответ, так как я не знаю, с какой именно проблемой вы столкнулись, но очень часто вам не нужна вся эта информация, т.е. вы заботитесь только о собственных значениях матрицы с наибольшим количеством энергии; а в остальном — действительно ли имеет значение, если у вас есть 0,001 в качестве собственного значения (диагонализируемая матрица) или 0,000 (недиагонализируемая)? Для многих реальных (и даже теоретических) приложений ответ «не совсем».
Итак, я предлагаю вам получить скорость отказавшись от точность или же зернистость информации, которую вы ищете.
Вы могли бы хотеть взять это с зерном соли, но Вот Вот некоторые тесты, опубликованные разработчиками Eigen. Я никогда не использовал никакую другую библиотеку линейной алгебры, кроме Eigen, но ваши потребности могут отличаться от моих.
Что касается поиска определителя, существует ряд различных реализаций, которые вы можете использовать. Одним из них является использование исключения Гаусса для создания верхней / нижней треугольной матрицы — это выгодно тем, что вам просто нужно умножить по диагонали, чтобы получить определитель. Если какая-либо строка или какой-либо столбец обнуляются в результате, у вас будет определитель 0, а у матрицы не будет обратного. Вы могли бы на самом деле использовать этот метод и дополнить матрицу единичной матрицей и выполнить полное исключение Гаусса-Джордана и превратить исходную матрицу в единичную матрицу, как видно на http://www.mathportal.org/linear-algebra/matrices/gauss-jordan.php .