【问题标题】:Conflicting eigen vector outputs between Matlab and NumpyMatlab 和 Numpy 之间的特征向量输出冲突
【发布时间】:2013-09-23 22:04:49
【问题描述】:

我在 Matlab 和 Numpy 中计算特征向量,但得到不同的结果。我的印象是给定矩阵只有一组特征向量,但是这两个输出似乎都是有效的。

这是我的matlab代码:

m = [  1.4675 + 0.0000i   0.1669 + 1.2654i;
       0.1669 - 1.2654i   1.3085 + 0.0000i]
[eig_vec,eig_val] = eig(m)

eig_val 包含:

eig_val =
     0.1092         0
          0    2.6668

eig_vec 包含:

eig_vec =
      0.0896 + 0.6789i   0.0953 + 0.7225i
     -0.7288 + 0.0000i   0.6848 + 0.0000i

这是我的python代码:

m = np.array([[1.46753694+0.j,         0.16692111+1.26535838j],
              [0.16692111-1.26535838j, 1.30851770+0.j]])
eig_val,eig_vec = linalg.eigh(m)

eig_val 包含:

array([ 0.10923247,  2.66682217])

eig_vec 包含:

array([[-0.68477170+0.j        , -0.72875765+0.j        ],
       [ 0.09530915-0.72249836j, -0.08955653+0.67889021j]])

谁能解释为什么这些输出不同,似乎两组不同的特征向量都是彼此的旋转版本。一组比另一组更正确吗?

【问题讨论】:

  • 特征向量不是唯一的:stackoverflow.com/a/18152804/97160,但我认为 MATLAB 和 NumPy 都依赖相同的 LAPACK 例程来计算它们,因此您可能会得到相似的结果。
  • 请参阅this older question 了解更多关于特征向量的非唯一性(它与 matlab 与 mathematica 相关,但本质上是一个重复的问题)...

标签: python matlab numpy octave eigenvector


【解决方案1】:

这不是很明显,但是在这两种情况下,您返回的特征向量实际上是相同的。请尝试以下操作:

>>> matlab_eigvec = np.array([[0.0896+0.6789j, 0.0953+0.7225j],
...                           [-0.7288+0.j, 0.6848+0.j]])
>>> 
>>> f1, f2 = matlab_eigvec.T # matlab eigenvectors
>>> e1, e2 = eig_vec.T # numpy eigenvectors
>>> f1/e1
array([-0.13084653-0.99142531j, -0.13079065-0.99146862j])
>>> f2/e2
array([-0.13077050-0.99141326j, -0.13078845-0.99145198j])

因此,您可以通过将 numpy 乘以 -0.13-0.99j 来获得 matlab 特征向量,即它们是共线的,因此就特征向量而言是相同的。

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 2015-06-30
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多