【发布时间】: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