【问题标题】:finding the real eigenvectors of a real symmetric matrix in numpy or scipy在 numpy 或 scipy 中找到实对称矩阵的实特征向量
【发布时间】:2021-02-19 04:14:01
【问题描述】:

我有一个带有很多退化特征值的实对称矩阵,我想找到这个矩阵的实值特征向量。我正在努力寻找一种在 numpy 或 scipy 中为我执行此操作的方法,我尝试过的方法给出了复值特征向量。有谁知道这样的功能是否存在?

【问题讨论】:

  • 一种蛮力的方法是找到所有的特征值,然后将那些虚部为零的特征值存储到一个单独的数组中。我不认为有一种方法可以只找到真实的而不是想象的,但可能是错误的
  • 我的问题不是要找到真正的特征值。它们都是真实的。我的问题是关于找到真正的特征向量。
  • 对于实对称矩阵,eigh 应该可以工作。如果没有,请在问题中显示详细信息,以便我们尝试重现问题。
  • 我想我犯了一个错误。我正在使用 qutip 库 (qutip.org),我在 qutip 对象上调用了 all(isreal()),它返回了 true。但是,当我在 qutip 对象表示的完整矩阵上调用 all(isreal()) 时,它返回 false。我认为这是我困惑的根源。我认为沃伦你的答案可能是我问题的正确答案。
  • 尝试将分析答案发布到示例矩阵,或给定输入的期望结果。这比一个人选择的措辞更容易解释

标签: python numpy eigenvector


【解决方案1】:

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

例如,

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 返回的特征向量为实数。
【解决方案2】:

简单。

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 返回的任意复杂特征向量集,并选择任何恰好是真实的。这不是我的想法。
  • 啊。那么我认为你的问题需要澄清。说你想要“实值特征向量”是模棱两可的。
【解决方案3】:
vals, vecs = eigh(a)
vals = vals.real
vecs = vecs.real

应该可以。

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多