下面是一些简单的代码,展示了我所看到的内容:
A = randn(1,5e6)+1i*randn(1,5e6);
B = randn(1,5e6)+1i*randn(1,5e6);
sum(A.*conj(B)) - A*B'
sum(A.*conj(B)) - mtimes(A,B')
A*B' - mtimes(A,B')
现在,底部显示的三种方法应该做同样的事情,所以答案应该为零,对吗?错误的!差异很小,但还没有小到可以忽略不计的程度。另外,误差随着A和B长度的增加而增加。
有谁知道这些方法之间的实际区别是什么?我知道代码中可能写入了快捷方式,但如果可能的话,我想对其进行量化。 Matlab 会在任何地方发布差异吗?我环顾四周,但没有找到任何东西。
最佳答案
这可能与执行操作的顺序有关。例如,
sum(A.*conj(B)) - fliplr(A)*fliplr(B)'
给出的结果不同于
sum(A.*conj(B)) - A*B'
或者,更引人注目的是,
A*B' - fliplr(A)*fliplr(B)'
给出非零结果,与您的测试顺序相同。
所以我敢打赌,根据方法 (sum
或 *
),Matlab 在内部以不同的顺序执行操作,这很可能解释了不同的舍入您观察到的错误。
关于matlab - 矩阵乘法给出两个不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20474950/