在 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
应该可以。
我有一个带有很多退化特征值的实对称矩阵,我想找到这个矩阵的实值特征向量。我正在努力在 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
应该可以。