我注意到,matlab如何计算矩阵的特征值和特征向量,其中matlab返回实值,而numpy返回复杂值特征值和向量。例如:
对于矩阵:
showChannels
有没有一种方法可以像在Matlab中那样获取python中的真实特征值?
答案 0 :(得分:1)
要使NumPy在复杂部分较小时返回真实特征值的对角线数组,可以使用
In [116]: np.real_if_close(np.diag(w))
Out[116]:
array([[ 4., 0., 0.],
[ 0., -2., 0.],
[ 0., 0., -2.]])
根据Matlab docs,
[E, D] = eig(A)
返回满足E
的{{1}}和D
:
我没有Matlab,所以我将使用Octave来检查您发布的结果:
A*E = E*D
误差的幅度主要是由于Matlab报告的值是 displayed to a lower precision比Matlab在内存中保存的实际值高。
在NumPy中,octave:1> A = [[1, -3, 3],
[3, -5, 3],
[6, -6, 4]]
octave:6> E = [[ -0.4082, -0.8103, 0.1933],
[ -0.4082, -0.3185, -0.5904],
[ -0.8165, 0.4918, -0.7836]]
octave:25> D = [[4.0000, 0, 0],
[0, -2.0000, 0],
[0, 0, -2.0000]]
octave:29> abs(A*E - E*D)
ans =
3.0000e-04 0.0000e+00 3.0000e-04
3.0000e-04 2.2204e-16 3.0000e-04
0.0000e+00 4.4409e-16 6.0000e-04
返回w, v = np.linalg.eig(A)
和w
,它们满足
v
:
np.dot(A, v) = np.dot(v, np.diag(w))