为啥matlab和python中的特征向量计算不匹配?
Posted
技术标签:
【中文标题】为啥matlab和python中的特征向量计算不匹配?【英文标题】:Why are eigenvector computations in matlab and python not matching?为什么matlab和python中的特征向量计算不匹配? 【发布时间】:2021-12-01 12:31:36 【问题描述】:Matlab:
m1 = [ 333.33333333 83.33333333 0. ; 83.33333333 333.33333333 83.33333333 ; 0. 3.33333333 166.66666667]
k1 = [ 800. -400. 0.; -400. 800. -400.; 0. -400. 400.]
[vec, val] = eig(m1, k1)
vec =
-0.0106 -0.0289 0.0394
0.0183 -0.0000 0.0683
-0.0211 0.0289 0.0789
蟒蛇:
import scipy
import numpy as np
m1 = np.array[[333.33333333, 83.33333333, 0.], [ 83.33333333, 333.33333333, 83.33333333], [0., 83.33333333, 166.66666667]]
k1 = np.array[[800., -400., 0.], [-400., 800., -400.], [0., -400., 400.]]
val, vec = scipy.linalg.eig(m1, k1)
vec =
[[ 3.53553391e-01, -7.07106781e-01, 3.53553391e-01],
[ 6.12372436e-01, 1.88119544e-16, -6.12372436e-01],
[ 7.07106781e-01, 7.07106781e-01, 7.07106781e-01]]
所以 matlab 和 python 特征向量vec
不匹配。 Matlab document 说
[V,D] = eig(A,B) 返回广义特征值的对角矩阵 D 和全矩阵 V,其列是对应的右 特征向量,所以
A*V = B*V*D
.
和m1 * vec = k1 * vec * val
满足matlab 输出但不满足python 输出。如何使用 python、numpy 获得 matlab 给出的相似特征向量?
【问题讨论】:
我认为这个区别在之前的SO中已经讨论过了,虽然我没有太关注。看起来像两列的向量,但归一化是否相同?下单怎么样?np.linalg.eig
似乎有更完整的文档。
【参考方案1】:
特征向量不是唯一的;如果x
是一个特征向量,那么a * x
仍然是任何非零标量a
的特征向量。
看python和matlab的两个结果; matlab 中vec
的第一列看起来像python 中vec
第三列的缩放版本。 matlab 的第二列似乎是 python 的第二列的缩放版本(回忆1.88119544e-16
几乎为零)。第三列对应于第一列。所以我的猜测是matlab中的val
是python中val
的反转版本;我无法验证这一点,因为我现在没有 matlab,但你可以验证这一点。
同样在 python 中,请记住 *
是元素乘法(即,.*
在 matlab 中)。您可以使用@
进行矩阵乘法。
import scipy.linalg
import numpy as np
m1 = np.array([[333.33333333, 83.33333333, 0.], [ 83.33333333, 333.33333333, 83.33333333], [0., 83.33333333, 166.66666667]])
k1 = np.array([[800., -400., 0.], [-400., 800., -400.], [0., -400., 400.]])
val, vec = scipy.linalg.eig(m1, k1)
print(m1 @ vec)
print(k1 @ vec * val)
正如你在下面的输出中看到的,我们有相同的输出(虚部是0.j
,所以你可以忽略它)。
输出:
[[ 1.68882167e+02 -2.35702260e+02 6.68200939e+01]
[ 2.92512493e+02 -3.14270210e-09 -1.15735798e+02]
[ 1.68882167e+02 1.17851130e+02 6.68200939e+01]]
[[ 1.68882167e+02+0.j -2.35702260e+02+0.j 6.68200939e+01+0.j]
[ 2.92512493e+02+0.j -3.14263578e-09+0.j -1.15735798e+02+0.j]
[ 1.68882167e+02+0.j 1.17851130e+02+0.j 6.68200939e+01+0.j]]
【讨论】:
以上是关于为啥matlab和python中的特征向量计算不匹配?的主要内容,如果未能解决你的问题,请参考以下文章