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

3
我在使用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)

也许这可以帮助?http://www.mathworks.com/matlabcentral/newsreader/view_thread/309237 - arturomp
@amp 谢谢,我之前看过这篇帖子,但没有解决我的问题。事实上,在那篇帖子中执行的示例并没有给我复杂特征向量。 - user2471801
那么你是说对于你上面的代码,isreal(vec) 返回 0? 这确实是你得到复数值时使用的代码吗?虚部有多大?它们几乎为零吗? 你使用的 Matlab 版本是什么(在命令窗口中键入 version)? - horchler
@horchler 正确,isreal(vec)返回0,上面的代码就是我使用的精确代码。特征向量中最大的虚部是+0.0052i,MATLAB版本为7.13.0.564(R2011b)。我在下面回复了A. Donda,说我的台式机不支持复数,但我的笔记本电脑支持。我不明白为什么(操作系统相同,MATLAB版本相同)。 - user2471801
1
您可以使用函数cdf2rdf,将复杂矩阵转换为实数模拟,而不会失去任何精度。http://www.mathworks.com/help/matlab/ref/cdf2rdf.html - Ilya Cherevkov
2个回答

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)

现在的结果是正确的。感谢您抽出时间回答我的问题,感谢您提供的所有建议。这只是一种解决方法,而不是解决方案。我仍然不知道为什么双精度会导致复杂的特征向量。


这个解决方法可能有效,也可能无效。为了确保D是对称的,最好使用D = 0.5*(D+D')而不是D=single(D) - chtz

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


1
我尝试了你生成D的方法,它运行良好。所以我猜就像你说的那样,是我计算D的方式有问题。这是我生成D的方法。特征值不是问题,因为虚部为零。但特征向量是个问题。P = eye(10) - 1/10; delta = 1 - eye(10); A = -0.5 * delta;D = PAP; [vec val] =eig(D) - user2471801
@user2471801,我建议您将代码包含在问题文本中。这样其他人就更容易找到并阅读了 :-) - Stewie Griffin
@RobertP。感谢Robert P。我编辑了我的帖子,并以易读的格式添加了代码。 - user2471801
@A.Donda 我正在使用双精度。我切换到单精度,但它不会给出复数。有些奇怪的事情正在发生。我的笔记本电脑对于D给出复数,但是我的台式机使用双精度却给出实数。两台机器都有相同的操作系统和MATLAB版本。 - user2471801
@user2471801 这真的很奇怪。我从未听说过这样的事情,但我唯一能想到的是可能存在硬件问题(处理器或内存?)。虽然不是100%确定,但据我所知,Matlab应该在所有平台上给出完全相同的结果,因为使用的数字精度和库是相同的。 - A. Donda
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接