【问题标题】:faster way to add many large matrix in matlab在matlab中添加许多大矩阵的更快方法
【发布时间】: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


【解决方案1】:

最快的方法是在 matlab 中根本不使用任何循环。 在许多情况下,matlab 的内部函数都经过优化以使用 SIMD 或其他加速技术。 使用内置功能创建所需大小的矩阵的示例是X = rand(sz1,...,szN)。 在您的明确情况下,sum(rand(400,400,400),3) 应该会给您最快的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多