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是逻辑的,但如果c是uint8或double则不是
>对于矢量也是如此,而不仅仅是方形矩阵
如on a MATLAB product page所述:
Run your programs faster with the redesigned MATLAB® execution engine.
The improved architecture uses just-in-time (JIT) compilation of all
MATLAB code with a single execution pathway. The engine offers
improved language quality and provides a platform for future
enhancements.Specific performance improvements include those made to:
…
Element-Wise Math Operations
The execution of many element-wise math operations is optimized. These
operations are element-by-element arithmetic operations on arrays such
as the following:
>> b = ((a+1).*a)./(5-a);
但是,看一下.*和*的文档,我看不出太多关于这个问题的信息.关于数组操作的array vs matrix operations注释.*:
If one operand is a scalar and the other is not, then MATLAB applies
the scalar to every element of the other operand. This property is
known as scalar expansion because the scalar expands into an array of
the same size as the other input, then the operation executes as it
normally does with two arrays.
并且doc of the matrix product *
说
If at least one input is scalar, then A*B is equivalent to A.*B and
is commutative.
如我们所见,A * B和A. * B的等价性是有争议的.嗯,它们在数学上是等价的,但是有些奇怪的事情正在发生.
由于上面的注释,以及逻辑阵列仅产生性能差异这一事实,我认为这是一个未记录的功能.我认为它与逻辑相关,每个逻辑仅占用1个字节,但是uint8数组没有表现出加速.我建议由于逻辑实际上只包含一位信息,因此可以进行一些内部优化.这仍然无法解释为什么mtimes不会这样做,而且它肯定与时间与m次的内部运作有关.
有一件事是肯定的:对于标量操作数,时间实际上并没有落后于mtimes(也许它应该?).由于在R2012b中缺少整体效果,我相信上面提到的新执行引擎的优化数组操作分别处理逻辑数组,允许加速标量.* logical_array的特殊情况,但是mtimes缺少相同的优化.