考虑以下代码:
a=rand(10000); b=rand(10000);
tic; 2*(a<b); toc;
tic; 2.*(a<b); toc;
结果是:
Elapsed time is 0.938957 seconds.
Elapsed time is 0.426517 seconds.
为什么第二种情况比第一种情况快两倍?
编辑 :
无论您测试矩阵的顺序如何,无论使用任何尺寸的矩阵,我都能获得相同的结果
(a<b).*3.56 vs (a<b)*3.56
例如,但不包括
(a.*b)*2 vs (a.*b).*2
或者
(a*b)*2 vs (a*b).*2
似乎与逻辑数组存在链接,因为与
(a&b)*2 vs (a&b).*2
电脑:R2015b,Windows 10 x64
最佳答案
我建议对性能进行更严格的检查。将您的测试放在一个命名函数中,以使MATLAB优化两个代码段,并运行两个代码几次,从而选择最快的运行时。我的直觉是他们应该花相同的时间,尽管我现在无法检查合理的矩阵大小。这是我要做的:
function product_timing(N)
a=rand(N);
b=rand(N);
tmin=inf;
for k=1:10
tic;
res1=2*(a<b);
t=toc;
if t<tmin
tmin=t;
end
end
disp(tmin);
tmin=inf;
for k=1:10
tic;
res2=2.*(a<b);
t=toc;
if t<tmin
tmin=t;
end
end
更新
在我的R2012b上,这两种方法之间似乎没有明显的区别。但是,正如其他人所指出的那样,R2015b及其新的执行引擎使一切变得不同。
虽然我仍然不确定答案,但让我收集@x1hgg1x(对此答案和问题的评论)和@LuisMendo(in chat)的反馈,以阐述我的无知:
如果
c*3.56
是c.*3.56
,c
是一个比logical
(具有任何标量)慢的整数倍(线程数?),但是如果c
是uint8
或double
如前所述on a MATLAB product page:
但是,查看
.*
和*
的文档,我看不到太多与该问题有关的信息。 array vs matrix operations关于数组操作(如.*
)的注释:然后doc of the matrix product
*
说如我们所见,
A*B
和A.*B
的等效性是有争议的。好吧,它们在数学上是等效的,但是正在发生一些奇怪的事情。由于上述说明,以及性能差异仅出现在
logical
数组上的事实,我认为这是一个未记录的功能。我以为它与logical
只是每个字节占用1个字节有关,但是uint8
数组并没有体现提速。我建议由于logical
实际上只包含一点信息,因此可以进行一些内部优化。这仍然不能解释为什么mtimes
不这样做,并且肯定与times
和mtimes
的内部运作有关。可以肯定的是:对于标量操作数,
times
实际上并没有依赖mtimes
(也许应该吗?)。由于在R2012b中缺少整体效果,因此我相信上述新执行引擎的优化数组操作将逻辑数组分开对待,从而可以加快scalar.*logical_array
的特殊情况,但是mtimes
缺少相同的优化。关于performance - 为什么在Matlab中,*标量运算符在某些情况下比*更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34832279/