Я пытаюсь найти наименьшее (как в большинстве отрицательных, а не наименьшее значение) несколько собственных значений списка разреженных эрмитовых матриц в Python, используя scipy.sparse.linalg.eig sh. Матрицы составляют ~ 1000x1000, а длина списка ~ 500-2000. Кроме того, я знаю верхнюю и нижнюю границы собственных значений всех матриц - назовите их eig_UB и eig_LB соответственно.
Я пробовал два метода :
- Использование режима инверсии сдвига с сигмой = eig_LB .
- Вычитание eig_UB из диагонали каждой матрицы (таким образом, сдвигая наименьшие собственные значения будут являться собственными значениями наибольшей величины), диагонализируя результирующие матрицы с настройками eig sh по умолчанию (без режима инвертирования с сдвигом и используя which = 'LM'), а затем добавляя eig_UB к результирующим собственным значениям .
Оба метода работают и их результаты совпадают, но метод 1 примерно в 2-2,5 раза быстрее. Это кажется нелогичным, поскольку (по крайней мере, как я понимаю в документации eig sh) режим инвертирования смещением вычитает сигму из диагонали, инвертирует матрицу и затем находит собственные значения, тогда как режим по умолчанию непосредственно находит собственные значения наибольшей величины. Кто-нибудь знает, что может объяснить разницу в производительности?
Еще одна часть информации: я проверил, и матрицы, которые являются результатом инверсии сдвига (то есть, (M-сигма * идентичность) ^ ( -1) если M - исходная матрица) больше не являются разреженными, что, похоже, должно привести к тому, что поиск их собственных значений займет еще больше времени.