неинтуитивная разница в скорости между режимами LM и Shift-Invert в scipy.sparse.linalg.eig sh? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь найти наименьшее (как в большинстве отрицательных, а не наименьшее значение) несколько собственных значений списка разреженных эрмитовых матриц в Python, используя scipy.sparse.linalg.eig sh. Матрицы составляют ~ 1000x1000, а длина списка ~ 500-2000. Кроме того, я знаю верхнюю и нижнюю границы собственных значений всех матриц - назовите их eig_UB и eig_LB соответственно.

Я пробовал два метода :

  1. Использование режима инверсии сдвига с сигмой = eig_LB .
  2. Вычитание eig_UB из диагонали каждой матрицы (таким образом, сдвигая наименьшие собственные значения будут являться собственными значениями наибольшей величины), диагонализируя результирующие матрицы с настройками eig sh по умолчанию (без режима инвертирования с сдвигом и используя which = 'LM'), а затем добавляя eig_UB к результирующим собственным значениям .

Оба метода работают и их результаты совпадают, но метод 1 примерно в 2-2,5 раза быстрее. Это кажется нелогичным, поскольку (по крайней мере, как я понимаю в документации eig sh) режим инвертирования смещением вычитает сигму из диагонали, инвертирует матрицу и затем находит собственные значения, тогда как режим по умолчанию непосредственно находит собственные значения наибольшей величины. Кто-нибудь знает, что может объяснить разницу в производительности?

Еще одна часть информации: я проверил, и матрицы, которые являются результатом инверсии сдвига (то есть, (M-сигма * идентичность) ^ ( -1) если M - исходная матрица) больше не являются разреженными, что, похоже, должно привести к тому, что поиск их собственных значений займет еще больше времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...