【问题标题】:different eigenvectors of the same hermitian matrix in matlab&pythonmatlab&python中同一个厄米特矩阵的不同特征向量
【发布时间】:2019-10-01 15:49:28
【问题描述】:

我正在尝试计算 3x3 厄米特矩阵(名为 coh)的特征值和特征向量。这是我正在使用的matlab代码,


coh = [0.327064707875252 + 0.00000000000000i    -0.00770057737827301 + 0.0178948268294334i  -0.00368526462214552 - 0.00615056270163515i
-0.00770057737827302 - 0.0178948268294334i  0.0122797042131420 + 0.00000000000000i  -0.000822583499745789 + 0.000295265015599135i
-0.00368526462214553 + 0.00615056270163516i -0.000822583499745789 - 0.000295265015599135i   0.00526291178539395 + 0.00000000000000i];

[V,D]=eig(coh);

V =

   0.9979 + 0.0000i   0.0229 - 0.0580i   0.0141 + 0.0140i
  -0.0243 - 0.0565i   0.9937 + 0.0000i   0.0936 + 0.0093i
  -0.0114 + 0.0192i  -0.0929 + 0.0104i   0.9954 + 0.0000i

% It should be real valued eigenvalue??
D =

   0.3284 - 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0111 - 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0050 + 0.0000i

我在文档中使用 matlab 中的 eig() 函数,它说“当 A 是实数且对称或复 Hermitian 时,满足 Av = λv 的 e 的值是实数。”

为了与 python 比较结果,我使用了 np.linalg.eigh()。

import numpy as np
import scipy

coh = np.array([[ 0.32706471+0.j, -0.00770058+0.01789483j,-0.00368526-0.00615056j],
       [-0.00770058-0.01789483j,  0.0122797 +0.j,-0.00082258+0.00029527j],
       [-0.00368526+0.00615056j, -0.00082258-0.00029527j,0.00526291+0.j]])

eigenh = np.linalg.eigh(coh)

特征值和特征值的结果 python中的向量是,

%eigenvalue
0.00504925
0.0111318
0.328426

%eigenvector
 (-0.01992713254631731+0.0j)     (0.0623407637085597+0.0j)   (-0.9978559708538679-0.0j)
 (-0.07298515890572027+0.05929161455059334j)     (0.3655270698873978+0.9239915820830416j)    (0.02429370804648004+0.05654205684315627j)
 (-0.706622215529945+0.7010318287578136j)    (-0.043891589739820214-0.08256315733761976j)    (0.011369094995309527-0.01915767907577206j)

matlab "eig()" 和 python "np.linalg.eigh()" 之间存在显着差异。我认为这不是标准化问题。因为,当我对对称矩阵(不是厄米特 - 实值)使用相同的函数时,结果完全相同。

补充说明

当我检查 coh 矩阵(上面给出的原始输入)是否为厄米特矩阵时,matlab 返回逻辑 0。

ishermitian(coh)
ans =
  logical
   0

但是,当我将输入矩阵四舍五入 16 时,matlab 返回逻辑 1。 *从 16 取更高的舍入值返回逻辑 0。

coh2 = round(coh,16)
ishermitian(coh2)
ans =
  logical
   1

即使我得到带有舍入输入矩阵的实值特征值,特征向量仍然与 python 不同

[V2,D2]=eig(coh2);
V2 =
   0.0141 + 0.0140i   0.0293 - 0.0550i   0.5093 + 0.8581i
   0.0936 + 0.0093i   0.9874 + 0.1110i   0.0362 - 0.0497i
   0.9954 + 0.0000i  -0.0935 + 0.0000i  -0.0223 + 0.0000i

D2 =
    0.0050         0         0
         0    0.0111         0
         0         0    0.3284

【问题讨论】:

  • 你的矩阵有重复的特征值吗?
  • 请提供一些代码,其中包含您遇到问题的矩阵示例。
  • 如果副本不能解释您的问题,请edit您的问题包括矩阵、代码和两个程序的输出。
  • @CrisLuengo,我编辑了我的问题。它不是重复的,也不能解释我的问题。

标签: python matlab


【解决方案1】:

如果你写imag(D),你会看到特征值的虚部是1e-18的数量级。这是在 0 的舍入误差内(与特征值的大小相比)。但是因为 MATLAB 不知道特征值应该是实值,所以它会将它们作为复数提供给您。

如果您知道特征值应该是实值,只需取其实部即可:

D = real(D);

关于已编辑的问题:

矩阵coh 几乎是 Hermitian,但不完全是。例如,您可以通过以下方式进行检查:

max(abs(reshape((coh - coh')./coh, 1, [])))

这将返回 1.9e-15。这比eps 大一个数量级,这就是MATLAB 不认为它是Hermitian 的原因。

在 Python 代码中输入的矩阵略有不同。如果我将这些值复制到 MATLAB,我会看到:

coh2 = [0.32706471+0.0j, -0.00770058+0.01789483j, -0.00368526-0.00615056j
       -0.00770058-0.01789483j,  0.0122797+0.0j, -0.00082258+0.00029527j
       -0.00368526+0.00615056j, -0.00082258-0.00029527j, 0.00526291+0.0j];
max(abs(reshape((coh2 - coh2')./coh2, 1, [])))

此代码返回 0。ishermitian(coh2) 也返回 true

最后比较cohcoh2的特征值,我们发现差异在1e-8数量级:

flip(real(eig(coh))) - eig(coh2) % `flip` fixes the ordering difference
ans =
   1.0e-08 *
   0.085548579158157
   0.539922194800480
  -0.238091968363108

【讨论】:

  • 不,它仍然不能解决我的问题。我尝试了您的解决方案并编辑了我上面的问题。
  • @MehmetFurkanÇELİK:这些特征值有何不同? (提示:它们的排序方式不同)
  • @CrisLuengo 特征值相同,但特征向量仍然不同。
  • @CrisLuengo python 和 matlab 中使用的“coh”矩阵是相同的。解释中只显示较少的小数部分。但实际上,这两个矩阵完全一样。我知道特征值是相同的,但它们是相反的。我的主要问题是python和matlab给出相同的特征值但不同的特征向量。
猜你喜欢
  • 2020-09-06
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2013-04-06
  • 2013-11-30
相关资源
最近更新 更多