【发布时间】:2013-12-09 15:59:55
【问题描述】:
下面是一些简单的代码,显示了我所看到的:
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 会在任何地方发布差异吗?我环顾四周,但没有找到任何东西。
【问题讨论】:
-
在 Octave 中它们都是零(即使是
format long g)... -
@am304 既然你有八度:你能试试
A*B' - fliplr(A)*fliplr(B)'吗? -
ans = -1.31512933876365e-009 - 1.06410880107433e-010i所以不是零... -
@am304 谢谢。这支持了我的猜测,即 OP 中描述的错误是由 Matlab 内部选择不同的操作顺序引起的
-
使用有限精度时最终会出现错误。请记住,您发现的两种解决方案可能都是“错误的”。如果您需要更精确,可以尝试使用符号工具箱。
标签: matlab matrix-multiplication