我尝试通过 numpy.linalg.eig
将n*100*100
3D矩阵K
对角度化,并获取eigenvalues w
和eigenVectors v
。矩阵是100*100
,但我想通过广播来完成,这就是我设置的数字n
。矩阵不是庇护所。
w,v=np.linalg.eig(K)
首先,我尝试了n=1000
,我得到了真正的特征值和特征向量,即xxxxxxxxxe+xx
,但是当我尝试n=2000
时,w
和v
的元素显示xxxxxxxxxe+xx+0.j
。由于+0.j
,使用w
和v
进行进一步计算时,它给出了复杂的数字。
- 我认为这是因为浮点数计算的算法错误,但是为什么?
- numpy.linalg是否使用拉帕克?这是否可能来自拉帕克(Lapack(的错误?
- 我如何摆脱
+0.j
?
根据文档,numpy.linalg.eig
使用(对于真实参数(Lapack例程DGEEV,该dgeev对输入矩阵没有任何假设(除了真实(。如果矩阵在浮点精度之内足够对称,则返回特征值的复杂部分为零(DGEEV
的输出参数WI
(。但是,由于精度有限,可能会遇到一些虚假的复杂零件。
编辑:
-
如果您确定矩阵只有真实的特征值,则可以使用
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
铸造的特征值。