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)
这是怎么回事?
虽然确实存在对称矩阵的特征向量的标准正交基础,但不能保证Numpy将返回该基础.它将返回任何特征向量的基础,这种方法没有任何错误.
您正在查看的矩阵有两个本征空间:特征值为3的二维空间和一维内核.对于内核,特征向量确定为常数因子.但是,对于二维空间,您可以自由选择基础,并且无法保证它是正交的.
要获得对称矩阵的特征向量的标准正交基,可以使用numpy.linalg.eigh().