在 numpy 或 scipy 中找到实对称矩阵的实特征向量

finding the real eigenvectors of a real symmetric matrix in numpy or scipy

我有一个带有很多退化特征值的实对称矩阵,我想找到这个矩阵的实值特征向量。我正在努力在 numpy 或 scipy 中找到一种方法来为我做这件事,我试过的方法给出了复值特征向量。有谁知道有没有这样的功能?

简单。

the docs 的帮助下:

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]

使用numpy.linalg.eigh or scipy.linalg.eigh。这些函数是为对称(或 Hermitian)矩阵设计的,对于实对称矩阵,它们应该总是 return 实特征值和特征向量。

例如,

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.        ]])
vals, vecs = eigh(a)
vals = vals.real
vecs = vecs.real

应该可以。