相关文章推荐
活泼的楼梯  ·  oracle sql sum函数求和-掘金·  10 月前    · 
威武的日记本  ·  C# ...·  1 年前    · 

用numpy或scipy查找实数对称矩阵的实数特征向量

4 人关注

我有一个实数对称矩阵,有很多退化的特征值,我想找到这个矩阵的实值特征向量。我很难在numpy或scipy中找到一个方法来做这件事,我试过的方法都是给出复值的特征向量。有人知道是否存在这样的函数吗?

5 个评论
一个强硬的方法是找到所有的特征值,然后从这些特征值中把虚部为零的特征值存入一个单独的数组。 我不认为有一种方法可以只找到实数而不找到虚数,但可能是错的。
我的问题不是关于寻找真实的特征值。它们都是实数。我的问题是关于寻找真实的特征向量。
对于一个实数对称矩阵, eigh 应该可以工作。 如果没有,请在问题中显示细节,这样我们可以尝试重现这个问题。
我想我犯了一个错误。我正在使用qutip库( qutip.org ),我在qutip对象上调用all(isreal()),结果返回true。但是当我在qutip对象所代表的完整矩阵上调用all(isreal())时,它返回了false。我想这就是我困惑的根源。我想,沃伦你的答案可能是我问题的正确答案。
试着发表对一个例子矩阵的分析性答案,或从一个给定的inpu中获得的预期结果。相对于一个人的措辞选择来说,这更容易解释。
python
numpy
eigenvector
Joel Klassen
Joel Klassen
发布于 2015-07-23
3 个回答
Warren Weckesser
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
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返回的任意一组复数特征向量中,选择任何恰好是实数的。这不是我所想的。
啊。那么我想你的问题需要澄清一下。说你想要 "实值的特征向量 "是模棱两可的。
py_newbie
py_newbie
发布于 2021-02-19
0 人赞同