Складність інверсії матриці в нумері


11

Я розв'язую диференціальні рівняння, які потребують інвертування щільних квадратних матриць. Ця інверсія матриці займає більшу частину мого часу на обчислення, тому мені було цікаво, чи використовую я найшвидший доступний алгоритм.

Мій поточний вибір - numpy.linalg.inv . З моїх числових цифр я бачу, що вона масштабується як де n - кількість рядків, тому метод видається гауссовим усуненням.O(n3)

Згідно з Вікіпедією , існують більш швидкі алгоритми. Хтось знає, чи є бібліотека, яка реалізує їх?

Цікаво, чому не нудить, використовуючи ці більш швидкі алгоритми?


Потрібно виконати матриці раніше. Подивіться на Scipy. Рідкий за вашу допомогу. Він містить багато необхідних інструментів.
Тобал

@Tobal не впевнений, що я слідую ... як би ви "виконали" матрицю? і як саме scipy.sparseдопомогло б ?
GoHokies

@GoHokies scipy є доповненням до нуме. Щільні / розріджені матриці повинні бути впроваджені заздалегідь, перш ніж робити деякі розрахунки, це покращує ваші обчислення. Прочитайте, будь ласка, цей docs.scipy.org/doc/scipy/reference/sparse.html він пояснює краще за мене своєю поганою англійською мовою.
Тобал

@Tobal Питання конкретно відноситься до щільним матрицями, так що я не бачу , як scipy.sparseактуально тут?
Крістіан Класон

2
@Tobal - Я думаю, я все ще не розумію. Що саме ви маєте на увазі під "заздалегідь підготуйте матриці", і "матриці повинні бути реалізовані задовго до того, як ви зробите деякі розрахунки"? Що стосується вашого останнього коментаря, то, безсумнівно, погоджуєтесь, що методи, які можна використовувати для рідких і щільних матриць, дуже різні.
Вольфганг Бангерт

Відповіді:


21

(Це стає занадто довго для коментарів ...)

n

  1. OnC1n3C2n2.xn

  2. Складність передбачає, що кожна (арифметична) операція займає один і той же час, але це фактично не відповідає дійсній практиці: Перемножувати купу чисел на одне число набагато швидше, ніж множення однакової кількості різних чисел. Це пов’язано з тим, що основна шийка пляшки в поточних обчисленнях - це отримання даних у кеш, а не власне арифметичні операції над цими даними. Тож алгоритм, який можна переставити, щоб мати першу ситуацію (звану кеш-обізнаним ), буде набагато швидшим, ніж той, де це неможливо. (Це стосується, наприклад, алгоритму Страссена.)

Також числова стабільність є не менш важливою, як і продуктивність; і тут, знову ж таки, стандартний підхід зазвичай виграє.

O(n3)O(n2.x)


A1bAx=bnumpy.linalg.solvexAA1A


Чудова відповідь, дякую, сер, зокрема, що вказав на чорта у деталях (константи у великій нотації O), що робить велику різницю між теоретичною та практичною швидкістю.
габоровий

Я вважаю, що частина "обернення рідко необхідна" слід більше підкреслювати. Якщо метою є розв'язання системи диференціальних рівнянь, мабуть, не потрібна повна обернена кількість.
Джаред Гогуен

@o_o Ну, це був мій перший оригінальний коментар (який я видалив після об'єднання всіх в одну відповідь). Але я подумав, що на користь сайту (та пізніших читачів) відповідь має відповісти на актуальне запитання (що є розумним і тематичним), навіть якщо за ним стоїть проблема XY. Крім того, я не хотів звучати занадто привабливо ...
Крістіан Класон

1
n

1
A

4

Вам, мабуть, слід зауважити, що, похований у глибині нумерованого вихідного коду (див. Https://github.com/numpy/numpy/blob/master/numpy/linalg/umath_linalg.c.src ), програма запрошення намагається викликати функцію dgetrf. з вашого системного пакету LAPACK, який потім виконує декомпозицію LU вашої вихідної матриці. Це морально еквівалентно усуненню Гаусса, але його можна налаштувати на дещо меншу складність, використовуючи швидші алгоритми множення матриці у високоефективних BLAS.

Якщо ви слідуєте цьому маршруту, вас слід попередити, що примусити весь бібліотечний ланцюг використовувати нову бібліотеку, а не систему, яку постачали разом з вашим розповсюдженням, досить складно. Однією з альтернатив сучасних комп'ютерних систем є перегляд паралельних методів за допомогою таких пакетів, як scaLAPACK або (у світі python) petsc4py. Однак вони, як правило, щасливіші, використовуються як ітераційні розв'язувачі для лінійних систем алгебри, ніж застосовані до прямих методів, а PETSc, зокрема, мішені рідкісні системи, ніж щільні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.