我有一个实数对称矩阵,有很多退化的特征值,我想找到这个矩阵的实值特征向量。我很难在numpy或scipy中找到一个方法来做这件事,我试过的方法都是给出复值的特征向量。有人知道是否存在这样的函数吗?
用numpy或scipy查找实数对称矩阵的实数特征向量
4
人关注
5
个评论
db1234
:
一个强硬的方法是找到所有的特征值,然后从这些特征值中把虚部为零的特征值存入一个单独的数组。 我不认为有一种方法可以只找到实数而不找到虚数,但可能是错的。
我的问题不是关于寻找真实的特征值。它们都是实数。我的问题是关于寻找真实的特征向量。
对于一个实数对称矩阵,
eigh
应该可以工作。 如果没有,请在问题中显示细节,这样我们可以尝试重现这个问题。
我想我犯了一个错误。我正在使用qutip库(
qutip.org
),我在qutip对象上调用all(isreal()),结果返回true。但是当我在qutip对象所代表的完整矩阵上调用all(isreal())时,它返回了false。我想这就是我困惑的根源。我想,沃伦你的答案可能是我问题的正确答案。
dermen
:
试着发表对一个例子矩阵的分析性答案,或从一个给定的inpu中获得的预期结果。相对于一个人的措辞选择来说,这更容易解释。
Joel Klassen
发布于
2015-07-23
3
个回答
Warren Weckesser
发布于
2021-02-19
已采纳
0
人赞同
Use
numpy.linalg.eigh
or
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. ]])
我试过了,它没有给我真实的特征向量
你能给我看一个例子吗,它是如何返回复数特征向量的?
@JoelKlassen 另外,如果你在问题中加入更多你已经尝试过的细节,会很有帮助。
我使用的矩阵是一个71 x 71的矩阵。我知道它既是实数又是隐数。我将尝试找到一个具有类似性质的更小的矩阵。
我刚刚仔细检查了来源,看起来是这样的。 如果输入矩阵是实数,
numpy.linalg.eigh
返回的特征向量就是实数。
exp1orer
发布于
2021-02-19
0
人赞同
有了来自的一点帮助
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]
eig函数返回一组特征向量,这些特征向量对所考虑的矩阵来说并不唯一。这是因为该矩阵是退化的。你的建议并没有为所考虑的矩阵找到一个完整的实数特征向量集,它只是从eig返回的任意一组复数特征向量中,选择任何恰好是实数的。这不是我所想的。
exp1orer
:
啊。那么我想你的问题需要澄清一下。说你想要 "实值的特征向量 "是模棱两可的。