我正在使用matlab的eig函数。
我发现Sxx和Sxx2是完全一样的。
但使用函数“eig”来获取特征值 D 和 D2。
有很大的不同。
%%
xt=Xnor';
Sxx=xt*Xnor/6299;
Sxx2=Xnor'*Xnor/6299;
%%
D = eig(Sxx);
D2 = eig(Sxx2);
我已经检查了矩阵 Sxx 和 Sxx2
数值都一样
但是D和D2的数值好像有很大的错误
D与D2值对比截图
我错过了什么吗?
@克里斯·卢恩戈
“……奇怪的是 MATLAB 在某种情况下会选择不同的算法……”
这一点也不奇怪。在一种情况下,代码强制 MATLAB 执行通用矩阵乘法(不保证结果严格对称):
xt=Xnor';
Sxx=xt*Xnor/6299; % symmetry not recognized, generic DGEMM() or ZGEMM() BLAS routine called.
在另一种情况下,MATLAB 解析器识别对称性并调用对称 BLAS() 矩阵乘法例程,这是一个完全不同的例程(保证结果严格对称)。
Sxx2=Xnor'*Xnor/6299; % symmetry recognized by parser, DSYRK() or ZSYRK() BLAS routine called
因此,在对称情况下,操作和计算的背景顺序发生了变化。人们应该预料到结果可能会略有不同。对结果进行排序应该会显示答案非常接近。
一般来说,我建议不要明确地形成转置。让 MATLAB 尽可能保持严格的对称性。