Какой самый быстрый способ вычисления собственных значений и собственных векторов двумерной вещественной симметричной матрицы - PullRequest
1 голос
/ 27 февраля 2020

Существует ли более быстрый способ вычисления собственных значений и собственных векторов двумерной реальной симметричной матрицы, кроме того:

N = 10101
S = np.random.random((N,N))
S = (S + S.T)/2

eigenValues, eigenVectors = np.linalg.eig(S)
idx = eigenValues.argsort()[::-1]

eigenValues = eigenValues[idx]
eigenVectors = eigenVectors[:,idx]

Это занимает слишком много времени для меня

1 Ответ

2 голосов
/ 27 февраля 2020

Я бы использовал np.linalg.eigh, поскольку он предназначен для матриц с реальной симметрией c и будет использовать специальный алгоритм. Еще одним преимуществом является то, что возвращенные собственные значения сортируются в порядке возрастания, поэтому вам не нужно использовать argsort().

Сравнение скорости с N = 1010, поэтому я не буду ждать вечно:

eig_vals, eig_vects = np.linalg.eig(S)
# 628 ms ± 45.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

eig_vals, eig_vects = np.linalg.eigh(S)
# 89.1 ms ± 2.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

from scipy import linalg as la
eig_vals, eig_vects = la.eigh(S)
# 346 ms ± 10.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

np.linalg.eigh самый быстрый на сегодняшний день.

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