我尝试按n*100*100
将K
三维矩阵numpy.linalg.eig
对角化,得到特征值w
和特征向量v
。矩阵是100*100
,但我想用广播来做,这就是我设置的数字n
。矩阵不是埃尔米特人。
w,v=np.linalg.eig(K)
首先,我尝试了n=1000
,我得到了真正的特征值和特征向量,即xxxxxxxxxe+xx
,但当我尝试n=2000
时,w
和{{1}的元素}}显示v
。由于xxxxxxxxxe+xx+0.j
,在使用+0.j
和w
进行进一步计算时,它给出了复数。
v
?答案 0 :(得分:0)
根据文档,numpy.linalg.eig
使用(用于实际参数)LAPACK例程DGEEV,它不对输入矩阵做任何假设(除了真实)。如果矩阵在浮点精度内足够对称,则返回的特征值的复杂部分将为零(WI
的输出参数DGEEV
)。但是,由于精度有限,可能会出现一些虚假的复杂零件。
编辑:
如果你确定你的矩阵只有真正的特征值,你可以用numpy.real
剥离复杂的部分,或者使用专门用于对称矩阵的numpy.linalg.eigh
。
至于numpy.linalg.eig
,numpy/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
投射到真实的特征值。