如果我们有两个矩阵X
和Y
,这两个矩阵都是二维的,现在在数学上我们可以说:sum(X-Y)=sum(X)-sum(Y)
。
哪个在Matlab中效率更高?哪个更快?
答案 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')
答案 1 :(得分:6)
你让我很好奇,我决定运行一些基准测试。当我完成时,似乎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')
我跑了几次,结果在我的机器上非常一致。我试图超过10 ^ 7个元素,让自己记忆犹新。随意延长测试时间,但我不认为这种关系会发生很大变化。
规格:Windows 8.1 Pro / Matlab R2013a on:
答案 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)消耗了许多内存访问,因此在大量元素中它可能消耗更多时间,但我没有解释为什么它对于少量元素更快。