【发布时间】:2018-07-19 14:38:21
【问题描述】:
我尝试将n*100*100 3d 矩阵K 对角化numpy.linalg.eig 并获得特征值w 和特征向量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?这可能是 LAPACK 的错误吗?
- 如何摆脱
+0.j?
【问题讨论】:
-
矩阵是对称的/厄米矩阵吗?你怎么知道它有真正的特征值?
-
好问题,我也在想办法。它不是厄米特,但没有广播,只是对角化一个
100*100矩阵总是给出真正的特征值和向量。如果我同时对 2000 个100*100矩阵进行对角化,它会显示+0.j虚部。 -
如果虚部为零,那么为什么不使用
output.real? -
+0.j表示特征值的虚部是 0 ?还是仅仅意味着它们是复数? -
您可以尝试使用numpy.set_printoptions() 切换打印精度。由于 double 的精度有限,
0.j后面可能会隐藏一个非常小的、不重要的虚数部分。您可以使用numpy.real将其丢弃。要检查删除复杂部分是否不会损坏特征向量 v 和特征值 w,您可以计算残差||w v - K.v||的范数并将其与范数||v||进行比较。
标签: python numpy matrix complex-numbers eigenvalue