Нахождение вещественных собственных векторов вещественной симметричной матрицы в numpy или scipy
У меня есть реальная симметричная матрица с большим количеством вырожденных собственных значений, и я хотел бы найти вещественные собственные векторы этой матрицы. Я изо всех сил пытаюсь найти метод в NumPy или Scipy, который делает это для меня, те, которые я пытался дать комплексные собственные векторы. Кто-нибудь знает, существует ли такая функция?
3 ответа
Использование numpy.linalg.eigh
или же scipy.linalg.eigh
, Эти функции предназначены для симметричных (или эрмитовых) матриц, и с реальной симметричной матрицей они всегда должны возвращать реальные собственные значения и собственные векторы.
Например,
In [62]: from numpy.linalg import eigh
In [63]: a
Out[63]:
array([[ 2., 1., 0., 0.],
[ 1., 2., 0., 0.],
[ 0., 0., 2., 1.],
[ 0., 0., 1., 2.]])
In [64]: vals, vecs = eigh(a)
Собственные значения находятся в vals
и соответствующие собственные векторы находятся в столбцах vecs
:
In [65]: vals
Out[65]: array([ 1., 1., 3., 3.])
In [66]: vecs
Out[66]:
array([[-0.70710678, 0. , 0. , 0.70710678],
[ 0.70710678, 0. , 0. , 0.70710678],
[ 0. , -0.70710678, 0.70710678, 0. ],
[ 0. , 0.70710678, 0.70710678, 0. ]])
Легко.
С небольшой помощью из документов:
import numpy as np
from numpy import linalg as LA
a = np.array([[1, 1j], [-1j, 1]])
w, v = LA.eig(a)
# w are the eigenvalues, v are the eigenvectors
# v.real gives the real-valued parts of the eigenvectors
# v == v.real gives a boolean mask for where the vector equals its own real part
real_eigenvectors = v[v.real == v]
vals, vecs = eigh(a)
vals = vals.real
vecs = vecs.real
должно сработать.