MATLAB中对称矩阵的复特征向量

时间:2013-11-17 23:05:10

标签: python matlab numpy linear-algebra eigenvector

使用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重写我的算法,但我宁愿避免这种情况。

注意:如果我尝试4x4矩阵,所有对角线元素= 0.375,所有非对角线元素= -0.125,则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)

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

否则

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的?也许它只有你所描述的大致结构?