【问题标题】:Complex eigenvectors of a symmetric matrix in MATLABMATLAB中对称矩阵的复特征向量
【发布时间】:2013-11-30 23:44:47
【问题描述】:

我在使用 MATLAB eig 函数计算对称矩阵的特征值和特征向量时遇到问题。

矩阵 D 是
10x10
所有对角线元素 = 0.45
所有非对角元素 = -0.05

当使用 [vec, val] = eig(D) 时,一些结果特征向量包含复数(即 0.3384 + 0.0052i)。我在网上搜索了两个关于类似问题的相关帖子,但没有帮助我找到解决方案。

所以我在 Python numpy (numpy.linalg.eigh(D)) 中尝试了相同的子程序,它给了我所有真实的特征值和特征向量。 Python 的结果是正确的,因为我能够用已发表的论文验证我的最终结果。

我的问题是什么导致 MATLAB 为对称矩阵提供复杂的特征值和特征向量?有办法解决吗?我当然可以用 Python 重写我的算法,但我宁愿避免这样做。

注意:如果我尝试所有对角线元素 = 0.375 且所有非对角线元素 = -0.125 的 4x4 矩阵,那么 MATLAB eig(D) 会给出所有实特征值和特征向量。

提前感谢您对此问题的任何建议。

跟进。用于生成 D 和特征值/向量的代码:

    P = eye(10) - 1/10;
    delta = 1 - eye(10);
    A = -0.5 * delta;

    D = P*A*P;
    [vec val] =eig(D)

【问题讨论】:

  • @amp 谢谢,我以前看过这篇文章,但它对我的问题没有帮助。事实上,执行该帖子中的示例并没有给我复杂的特征向量。
  • 所以你是说isreal(vec) 为你返回上面的代码0?这实际上是您在获得复杂值时使用的代码吗?虚部有多大?它们几乎为零吗?您使用的是什么版本的 Matlab(在命令窗口中输入 version)?
  • @horchler 正确,isreal(vec) 返回 0,上面的代码是我使用的确切代码。特征向量中最大的虚部分为+0.0052i,MATLAB版本为7.13.0.564(R2011b)。我在下面回复 A. Donda 说我的台式机没有给出复数,但我的笔记本电脑有。我不明白为什么(相同的操作系统,相同的 MATLAB 版本)
  • 您可以使用函数cdf2rdf 将复杂矩阵转换为真实的类似物而不会丢失任何精度mathworks.com/help/matlab/ref/cdf2rdf.html

标签: python matlab numpy linear-algebra eigenvector


【解决方案1】:

我能够使用单精度解决问题。

  P = eye(10) - 1/10;
  delta = 1 - eye(10);
  A = -0.5 * delta;

  D = P*A*P;
  D = single(D)
  [vec val] =eig(D)

现在的结果是正确的。感谢大家花时间回答我的问题,并感谢您的所有建议。这实际上更像是一种解决方法而不是解决方案。我仍然不知道为什么双精度会导致复杂的特征向量。

【讨论】:

  • 此解决方法可能有效,也可能无效。为了确保D 是对称的,最好使用D = 0.5*(D+D') 而不是D=single(D)
【解决方案2】:

在做

D = 0.5 * eye(10) - 0.05 * ones(10);
eig(D)

我明白了

ans =
     -2.08166817117217e-17
                       0.5
                       0.5
                       0.5
                       0.5
                       0.5
                       0.5
                       0.5
                       0.5
                       0.5

这还不错。结果中的第一个特征值显然应该为零,因此存在舍入误差,否则结果与预期一致。由于同样的数值精度有限的问题,我想最终也可能会有非常小的复杂部分,但实际上 Matlab 的 eig 应该检测对称性并只产生实值特征值。

您究竟是如何生成矩阵D 的?也许它只有您所描述的大致结构?

【讨论】:

  • 我尝试了你生成 D 的方式,它工作正常。所以我想就像你说的那样,这是我计算 D 的方式。这就是我生成 D 的方式。特征值不是问题,因为虚部为零。但是特征向量是问题所在。 P = 眼睛(10) - 1/10; delta = 1 - 眼睛(10); A = -0.5 * 增量; D = PAP; [vec val] =eig(D)
  • @user2471801,我建议您在问题文本中包含代码。这样其他人更容易找到和阅读:-)
  • @RobertP。谢谢 Robert P。我编辑了我的帖子并以可读格式添加了代码。
  • @user2471801:我无法重现该问题。用您的代码生成的 D 在舍入错误(1e-17)的顺序上与我的方式不同,并且它也不再完全对称(再次,大约 1e-17),但我仍然只得到实值特征向量和 - 值。特征值与我的相似,除了一个接近于零外,都是 0.5——应该是这样。也许你使用singleprecision?
  • @A.Donda 我使用的是双精度。我切换到单精度,它没有给出复数。发生了一些奇怪的事情。我的笔记本电脑给出了 D 的复数,但我的台式机给出了实数,使用的是双精度。两台机器都有相同的操作系统和相同版本的 MATLAB。
猜你喜欢
  • 2019-04-27
  • 2018-01-25
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多