kin*_*hen 5 python numpy matrix eigenvalue complex-numbers
我尝试将n*100*1003d矩阵对角化K,numpy.linalg.eig并获得特征值w和特征向量v。矩阵是100*100,但是我想通过广播来做,这就是n我设置的数字。矩阵不是厄米矩阵。
w,v=np.linalg.eig(K)
Run Code Online (Sandbox Code Playgroud)
起初,我尝试了n=1000,我得到真正的特征向量,即xxxxxxxxxe+xx,但当我尝试n=2000的,元素w和v表演xxxxxxxxxe+xx+0.j。由于+0.j,使用时给出了复数w并v进行了进一步的计算。
+0.j?根据文档,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)
Run Code Online (Sandbox Code Playgroud)因此测试是严格的比较all(w.imag == 0.0),只有这样才能将特征值转换为实数w = w.real。