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)

你让我很好奇,我决定运行一些基准测试.当我完成它似乎knedlsepp正确,因为较大的矩阵sum(X-Y)变得相当慢.
交叉似乎发生在10^3元素周围.

%% // 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上: 