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

nic*_*man 3 performance matlab matrix

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

哪个在Matlab中更有效?哪个更快?

Sam*_*rts 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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Hok*_*oki 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')
Run Code Online (Sandbox Code Playgroud)

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


规格:Windows 8.1 Pro/Matlab R2013a上: 眼镜