Нахождение вещественных собственных векторов вещественной симметричной матрицы в 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

должно сработать.

Другие вопросы по тегам