我在使用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和特征值/向量的代码:
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)
isreal(vec)
返回0
? 这确实是你得到复数值时使用的代码吗?虚部有多大?它们几乎为零吗? 你使用的 Matlab 版本是什么(在命令窗口中键入version
)? - horchlercdf2rdf
,将复杂矩阵转换为实数模拟,而不会失去任何精度。http://www.mathworks.com/help/matlab/ref/cdf2rdf.html - Ilya Cherevkov