python - 如何使特征值和特征向量保持真实而不是复杂?

标签 python numpy matrix complex-numbers eigenvalue

我尝试通过 numpy.linalg.eig 对角化 n*100*100 3d 矩阵 K 并获得特征值 w 和特征向量 v。矩阵是 100*100,但我想用广播来做,这就是我设置的数字 n。并且矩阵不是厄尔米特矩阵。

w,v=np.linalg.eig(K)

起初,我尝试了 n=1000,我得到了实特征值和特征向量,即 xxxxxxxxxe+xx,但是当我尝试 n=2000wv的元素显示xxxxxxxxxe+xx+0.j。由于+0.j,在使用wv做进一步计算时给出了复数。

  1. 我认为这是因为 float 计算的算法错误,但为什么呢?
  2. numpy.linalg 是否使用 LAPACK?这可能是 LAPACK 的错误吗?
  3. 如何摆脱 +0.j

最佳答案

根据文档,numpy.linalg.eig 使用(对于实参)LAPACK 例程 DGEEV它不对输入矩阵做出任何假设(除了是真实的)。如果矩阵在浮点精度内足够对称,则返回的特征值的复数部分将为零(DGEEV 的输出参数 WI)。但是,由于精度有限,您可能会得到一些虚假的复杂零件。

编辑:

  1. 如果您确定您的矩阵只有实数特征值,您可以使用 numpy.real 去掉复数部分。或使用 numpy.linalg.eigh专门用于对称矩阵。

  2. 至于numpy.linalg.eignumpy/linalg/linalg.py中的相关部分是:

    w, vt = _umath_linalg.eig(a, signature=signature, extobj=extobj)
    
    if not isComplexType(t) and all(w.imag == 0.0):
        w = w.real
        vt = vt.real
        result_t = _realType(result_t)
    else:
        result_t = _complexType(result_t)
    

所以测试是一个严格的比较all(w.imag == 0.0),然后才用w = w.real将特征值转换为实数。

关于python - 如何使特征值和特征向量保持真实而不是复杂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48695430/

相关文章:

python - datetime 忽略 tzinfo?

python - numpy 的参数方程

python - python中无替换的加权随机样本

python - 用于比较矩阵中的值的 ValueError

r - R 中的函数比 apply(..., ..., range) 快

Matlab - 8x8 窗口并查找平均值

python - django.db.utils.OperationalError : (1071, 'Specified key was too long; max key length is 767 bytes' )

Python (3.2.3) If Or 语句语法错误

python - 如何构建一个系统来处理 MQTT 代理和 Django

python - 二维 ndarray 的 Numpy fromfile 的填充顺序是什么?