Я решаю дифференциальные уравнения, которые требуют инвертировать плотные квадратные матрицы. Эта инверсия матрицы занимает большую часть моего времени вычислений, поэтому мне было интересно, использую ли я самый быстрый из доступных алгоритмов.
Мой текущий выбор - numpy.linalg.inv . Из моих чисел я вижу, что он масштабируется как где n - количество строк, поэтому метод, похоже, исключает Гауссу.
Согласно Википедии , существуют более быстрые алгоритмы. Кто-нибудь знает, есть ли библиотека, которая реализует это?
Интересно, а почему бы не использовать эти более быстрые алгоритмы?
numpy
dense-matrix
inverse
physicsGuy
источник
источник
scipy.sparse
поможет?scipy.sparse
здесь уместно?Ответы:
(Это слишком долго для комментариев ...)
Сложность предполагает, что каждая (арифметическая) операция занимает одно и то же время, но на практике это далеко не так: умножение набора чисел на одно и то же происходит намного быстрее, чем умножение одинакового количества разных чисел. Это связано с тем, что основным узким местом в современных вычислениях является получение данных в кэш, а не фактические арифметические операции с этими данными. Таким образом, алгоритм, который можно переставить так, чтобы он имел первую ситуацию (называемую кэшированием ), будет намного быстрее, чем алгоритм, в котором это невозможно. (Это относится к алгоритму Штрассена, например.)
Кроме того, численная стабильность, по крайней мере, так же важна, как и производительность; и здесь, опять же, стандартный подход обычно побеждает.
numpy.linalg.solve
источник
Вы, вероятно, должны заметить, что глубоко внутри скрытого исходного кода (см. Https://github.com/numpy/numpy/blob/master/numpy/linalg/umath_linalg.c.src ) процедура inv пытается вызвать функцию dgetrf из вашего системного пакета LAPACK, который затем выполняет LU-декомпозицию вашей исходной матрицы. Это морально эквивалентно исключению Гаусса, но может быть настроено на несколько меньшую сложность с помощью более быстрых алгоритмов умножения матриц в высокопроизводительной BLAS.
Если вы пойдете по этому пути, вы должны быть предупреждены, что заставить всю цепочку библиотек использовать новую библиотеку, а не системную, которая шла с вашим дистрибутивом, довольно сложно. Одной из альтернатив в современных компьютерных системах является рассмотрение параллельных методов с использованием таких пакетов, как scaLAPACK или (в мире python) petsc4py. Однако их, как правило, удобнее использовать в качестве итерационных решателей для систем линейной алгебры, чем применять к прямым методам, а PETSc в конкретных целевых разреженных системах больше, чем плотных.
источник