我有以下代码片段,尝试计算实对称矩阵的特征分解
K = 3;
n = 10;
Z = rand(n,K);
B = rand(K,K);
B = 0.5*(B+B') + 3*eye(K);
W = Z*B*Z';
if issymmetric(W) && isreal(W)
[U,D] = eig(W)
end
遗憾的是,这似乎在MATLAB R2013a上产生了真正复杂的特征向量。我曾经认为eig
应该保持一切真实的对称矩阵。任何人都知道为什么会这样?
PS。例如,更改为n = 6,输出一些真实的东西。
答案 0 :(得分:1)
eig
通常会返回实数特征向量。舍入错误可能会使Z*B*Z'
略微不对称。我不知道issymmetric
是如何实现的(它是内置函数),但也许eig
没有使用相同的标准来确定矩阵是否真实并且比issymmetric
对称。
强制矩阵在数值上对称的一种简单方法是执行(W+W')./2
。所以eig((W+W')./2)
应该返回实际值和向量。