java特征向量计算_Java与Python计算特征向量的区别

在apachecommons math3中,EigenDecomposition接受非对称矩阵,但它使用RealVector和{}类返回结果。为了得到实际的复杂结果,您必须将适当的实际结果组合成复共轭对。在

在特征向量的情况下,你得到:eigenvector[0] = {-0.8660254038; 0}

eigenvector[1] = {0.5; 1}

这两个向量都与复共轭特征值对getRealEigenvalue(0) + getImagEigenvalue(0)*i和{}相关联,但这些向量不是实际的特征向量。实际的特征向量是复共轭对

eigenvector[0] + eigenvector[1]*i和{}。在

这些向量仍然不能“匹配”numpy返回的结果,但这是因为这两个库没有使用相同的规范化。特征向量不是唯一的;特征向量乘以任何非零标量(包括复数标量)仍然是特征向量。Java结果和numpy结果之间的唯一区别是标量乘数。在

为了方便起见,我将浮点值转换为它们的精确值。也就是说,-0.8660254038是-sqrt(3)/2的浮点近似值。Java数学库给出了以下特征向量:

^{pr2}$

如果你把第一个特征向量乘以-(sqrt(2)/2)*i,第二个特征向量乘以(sqrt(2)/2)*i,你就会得到以numpy返回的特征向量。在

这是一个ipython会议的计算。v1和{}是上面显示的向量。在In [20]: v1 = np.array([-np.sqrt(3)/2 + 0.5j, 1j])

In [21]: v1

Out[21]: array([-0.8660254+0.5j, 0.0000000+1.j ])

In [22]: v2 = np.array([-np.sqrt(3)/2 - 0.5j, -1j])

In [23]: v2

Out[23]: array([-0.8660254-0.5j, 0.0000000-1.j ])

将v1乘以-(sqrt(2)/2)*i得到numpy.linalg.eig返回的第一个特征向量:In [24]: v1*(-np.sqrt(2)/2*1j)

Out[24]: array([ 0.35355339+0.61237244j, 0.70710678-0.j ])

将v2乘以(sqrt(2)/2)*i得到numpy.linalg.eig返回的第二个特征向量:In [25]: v2*(np.sqrt(2)/2*1j)

Out[25]: array([ 0.35355339-0.61237244j, 0.70710678+0.j ])

为了方便起见,这里重复了numpy计算。evecs的列是特征向量。在In [28]: evals, evecs = np.linalg.eig(a)

In [29]: evecs

Out[29]:

array([[ 0.35355339+0.61237244j, 0.35355339-0.61237244j],

[ 0.70710678+0.j , 0.70710678-0.j ]])

你可能感兴趣的:(java特征向量计算)