考虑以下代码:

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.56c.*3.56
  • c是一个比logical(具有任何标量)慢的整数倍(线程数?),但是如果cuint8double
  • ,则不是整数倍(线程数?)
  • 对于向量(不只是正方形矩阵)也是如此

    如前所述on a MATLAB product page:

    但是,查看.**的文档,我看不到太多与该问题有关的信息。 array vs matrix operations关于数组操作(如.*)的注释:

    然后doc of the matrix product *

    如我们所见,A*BA.*B的等效性是有争议的。好吧,它们在数学上是等效的,但是正在发生一些奇怪的事情。
    由于上述说明,以及性能差异仅出现在logical数组上的事实,我认为这是一个未记录的功能。我以为它与logical只是每个字节占用1个字节有关,但是uint8数组并没有体现提速。我建议由于logical实际上只包含一点信息,因此可以进行一些内部优化。这仍然不能解释为什么mtimes不这样做,并且肯定与timesmtimes的内部运作有关。
    可以肯定的是:对于标量操作数,times实际上并没有依赖mtimes(也许应该吗?)。由于在R2012b中缺少整体效果,因此我相信上述新执行引擎的优化数组操作将逻辑数组分开对待,从而可以加快scalar.*logical_array的特殊情况,但是mtimes缺少相同的优化。

    关于performance - 为什么在Matlab中,*标量运算符在某些情况下比*更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34832279/

  • 10-09 23:32