我一直试图使用numpy.linalg.eigh
的输出作为旋转矩阵,但它返回的特征向量形成的矩阵是不合适的;也就是说,它不是一个纯粹的旋转,而是一个旋转和反射的组合。你可以看到如下。
GG = np.array([[2.0, 0.146, 0.0064],
[0.146, -1.0, 0.0003],
[0.0064, 0.0003, -1.0]])
vals,vecs = np.linalg.eigh(GG)
np.linalg.det(vecs)
这将返回-0.9999999999。纯旋转将返回1.0。
我是不是错过了这个求解器的工作方式?如何让eigh
或其他函数返回正确的旋转矩阵?也许这个矩阵是无痕的这一事实导致了问题?
1条答案
按热度按时间fcwjkofz1#
考虑一个方阵
A
,假设v
是一个特征向量,e
是相应的特征值,即现在考虑一下,如果我们用标量
s
来缩放v
会发生什么,让我们设置w = v*s
:原来
w
也是特征值e
的特征向量!实际上,特征向量只定义为标量的倍数,所以惯例是我们将它们归一化为长度1
。所以如果你用-1
缩放一个特征向量,你仍然有一个有效的特征系统,这次是行列式+0.999...9
。为什么是
0.999...9
而不是1?我们使用floating point arithmetic,这是不准确的。如果你正在尝试解决数值问题,我建议你熟悉浮点数,它们的问题和限制以及最佳实践。显然