使用Python,我创建了一个对称矩阵X
,并使用代码Lambda, U = np.linalg.eig(X)
对角化它。我的理解是:由于X
是对称的,U
应该是酉的,但我发现情况并非如此,因为U
的特征值没有1
的绝对值,这也意味着这也不是缩放问题。我的问题是为什么U
不是单一的?
下面是一个最小可重复的例子,看看我得到了什么:
import numpy as np
#Symmetric matrix, which should be diagonalized by unitary
X = np.array([[-1.1918157 , 0. , 0. , 0. , 0.09852097,
0. , 0. , 0. ],
[ 0. , -1.1918157 , 0. , 0. , 0. ,
0.09852097, 0. , 0. ],
[ 0. , 0. , -1.08529969, 0. , 0. ,
0. , 0.07826825, 0. ],
[ 0. , 0. , 0. , -1.08529969, 0. ,
0. , 0. , 0.07826825],
[ 0.09852097, 0. , 0. , 0. , -1.00585682,
0. , 0. , 0. ],
[ 0. , 0.09852097, 0. , 0. , 0. ,
-1.00585682, 0. , 0. ],
[ 0. , 0. , 0.07826825, 0. , 0. ,
0. , -0.98276093, 0. ],
[ 0. , 0. , 0. , 0.07826825, 0. ,
0. , 0. , -0.98276093]])
#check if X is symmetric
assert np.linalg.norm(X - X.conj().T) == 0
#diagonalize X
Lambda, U = np.linalg.eig(X)
#check if U is unitary
print(
np.allclose(U @ U.conj().T, np.identity(U.shape[0])),
np.allclose(U.conj().T, np.linalg.inv(U))
)
#Since the above returns false, how non-unitary is it?
print(
np.linalg.norm(U @ U.conj().T - np.identity(U.shape[0])),
np.linalg.norm(U.conj().T - np.linalg.inv(U))
)
上面代码的输出是:
False False
0.994793051566498 1.1641788210519939
不能保证返回一个酉矩阵。
#diagonalize X
Lambda, U = np.linalg.eig(X)
从这行代码中,您发现X
的特征值(存储在Lambda
中)及其右特征向量(存储在矩阵U
中)。
这里唯一的酉项是特征向量,它们是U
的列。
In [4]: np.linalg.norm(U, axis=0)
Out[4]: array([1., 1., 1., 1., 1., 1., 1., 1.])
阅读更多关于特征值和特征向量:wiki, wolfram