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