我使用 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
)。参见 the doc .
这里唯一单一的东西是特征向量,它们是 U
的列。
In [4]: np.linalg.norm(U, axis=0)
Out[4]: array([1., 1., 1., 1., 1., 1., 1., 1.])
关于python - 当我尝试对角化对称矩阵时,为什么 `np.linalg.eig` 不返回酉矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72552940/