matlab sum(X-Y)vs sum(X) - sum(Y)

时间:2015-05-05 18:05:48

标签: performance matlab matrix

如果我们有两个矩阵XY,这两个矩阵都是二维的,现在在数学上我们可以说:sum(X-Y)=sum(X)-sum(Y)

哪个在Matlab中效率更高?哪个更快?

3 个答案:

答案 0 :(得分:11)

在我的机器上,sum(x-y)对于小型阵列来说稍微快一些,但对于较大的阵列,sum(x)-sum(y)要快得多。为了进行基准测试,我在具有32GB内存的Windows 7机器上使用MATLAB R2015a。

n = ceil(logspace(0,4,25));

for i = 1:numel(n)
    x = rand(n(i));
    y = rand(n(i));
    t1(i) = timeit(@()sum(x-y));
    t2(i) = timeit(@()sum(x)-sum(y));
    clear x y
end

figure; hold on
plot(n, t1)
plot(n, t2)
legend({'sum(x-y)', 'sum(x)-sum(y)'})
xlabel('n'); ylabel('time')
set(gca, 'XScale', 'log', 'YScale', 'log')

enter image description here

答案 1 :(得分:6)

你让我很好奇,我决定运行一些基准测试。当我完成时,似乎knedlsepp正确,因为较大的矩阵sum(X-Y)变得相当慢。

交叉似乎发生在10^3个元素周围。

img1

%% // Benchmark code

nElem = (1:9).'*(10.^(1:6)) ; nElem = nElem(:) ;    %'//damn pretifier
nIter = numel(nElem) ;

res = zeros(nIter,2) ;
for ii=1:nIter
    X = rand(nElem(ii) ,1) ;
    Y = rand(nElem(ii) ,1) ;

    f1 = @() sum(X-Y) ;
    f2 = @() sum(X)-sum(Y) ;

    res(ii,1) = timeit( f1 ) ;
    res(ii,2) = timeit( f2 ) ;
    clear f1 f2 X Y
end

loglog(nElem,res,'DisplayName','nElem')

我跑了几次,结果在我的机器上非常一致。我试图超过10 ^ 7个元素,让自己记忆犹新。随意延长测试时间,但我不认为这种关系会发生很大变化。

规格:Windows 8.1 Pro / Matlab R2013a on:specs

答案 2 :(得分:2)

假设x和y都具有N×M = K个元素,那么 对于sum(x)-sum(y),您有:

K内存访问读取x,K内存访问读取y,一次内存访问写入结果 - > 2K + 1存储器访问(假设sum函数内的中间和将保存在CPU寄存器中)。

2K和运算+ 1减法 - > 2k + 1个CPU操作。

总和(x - y): Matlab会计算x-y并存储输出然后计算总和,所以我们有K内存访问读取x,K内存访问读取y,K内存访问写入减法结果,K内存访问读取减法结果再次为sum函数,然后1个内存访问写入和结果 - > 4K + 1内存操作。

k个减法+ k个求和 - > 2K操作。

正如我们所看到的,sum(x - y)消耗了许多内存访问,因此在大量元素中它可能消耗更多时间,但我没有解释为什么它对于少量元素更快。