Numpy计算奇怪的eigeinvectors

Joã*_*tes 2 python matlab numpy

我使用numpy计算矩阵的特征向量,我得到了一些奇怪的结果.然后我决定使用Matlab,一切都很好.

L = np.array(([2,-1,-1],[-1,2,-1],[-1,-1,2]))
Lam,U = np.linalg.eig(L) #compute eigenvalues and vectors
#sort by ascending eigenvalues
I = [i[0] for i in sorted(zip(xrange(len(Lam)),Lam),key=lambda x: x[1])] 
Lam = Lam[I]
U = U[:,I]
print U.dot(U.T)

>> [[ 1.09 -0.24  0.15]
   [-0.24  1.15  0.09]
   [ 0.15  0.09  0.76]]
Run Code Online (Sandbox Code Playgroud)

结果很奇怪,因为我在期待U.dot(U.T) = I.在matlab中:

L = [2,-1,-1;-1,2,-1;-1,-1,2]
[V,D] = eig(L)
V*V'
ans =
    1.0000    0.0000   -0.0000
    0.0000    1.0000    0.0000
    0.0000    0.0000    1.0000
Run Code Online (Sandbox Code Playgroud)

顺便说一下U:

[[-0.58  0.82  0.29]
 [-0.58 -0.41 -0.81]
 [-0.58 -0.41  0.51]]
Run Code Online (Sandbox Code Playgroud)

和V:

0.5774    0.7634    0.2895
0.5774   -0.6325    0.5164
0.5774   -0.1310   -0.8059
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

Sve*_*ach 6

虽然确实存在对称矩阵的特征向量的标准正交基础,但不能保证Numpy将返回该基础.它将返回任何特征向量的基础,这种方法没有任何错误.

您正在查看的矩阵有两个本征空间:特征值为3的二维空间和一维内核.对于内核,特征向量确定为常数因子.但是,对于二维空间,您可以自由选择基础,并且无法保证它是正交的.

要获得对称矩阵的特征向量的标准正交基,可以使用numpy.linalg.eigh().