【发布时间】:2018-05-08 02:19:41
【问题描述】:
假设我有很多(大约 1000 个)大型矩阵(大约 1000 x 1000),我想将它们按元素相加。非常幼稚的方法是使用临时变量并在循环中累积。例如,
summ=0;
for ii=1:20
for jj=1:20
summ=summ+ rand(400);
end
end
在网上搜索了一段时间,有人说最好还是借助sum()。例如,
sump=zeros(400,400,400);
count=0;
for ii=1:20
for j=1:20
count=count+1;
sump(:,:,count)=rand(400);
end
end
sum(sump,3);
但是,我测试了两种方法后,结果是
Elapsed time is 0.780819 seconds.
Elapsed time is 1.085279 seconds.
这意味着第二种方法更糟糕。
所以我只是想知道是否有任何有效的方法来做加法?假设我正在使用具有非常大内存和 GTX 1080 的计算机(CUDA 可能会有所帮助,但我不知道是否值得这样做,因为通信也需要时间。)
感谢您的宝贵时间!任何回复将不胜感激!。
【问题讨论】:
-
如果你打开
profiler,那么你可以看到在第二种情况下创建sump变量需要大部分时间。但是一旦你有了那个矩阵,那么sum(sump,3)会更快。但是,在 case-1 中,即使您有现成的 400x400x400 矩阵,程序也会花费相同的时间。我想说,使用sum()会是最快的。 -
感谢您的评论!在我的案例中,关键点是我需要从零开始,这意味着需要生成每个矩阵(每个页面)。然后我总结了来自不同页面的每个元素。所以不是我事先有一些数据(矩阵)并且简单地求和(sump,3)。鉴于这种情况,您有什么建议更可取吗?
-
如果您要生成这些矩阵,我敢肯定,与生成相比,将它们相加将是微不足道的成本。例如,分析您的代码,您会看到
rand比+贵得多。只需在生成它们时添加它们。 -
您的问题听起来像是XY problem。你的问题的关键部分是什么?数据生成还是只是总结一切?以最快的方式解决上述问题,
sum(rand(400,400,400),3)应该会给你相当不错的结果。 -
感谢您的帮助!现在使用 sum(rand(400,400,400),3) 会快得多
标签: matlab performance sum add