【问题标题】:Why this multiplication is SO slow为什么这个乘法这么慢
【发布时间】:2014-05-28 10:37:40
【问题描述】:

我想将 2 个矩阵相乘。我需要将它们逐个元素相乘。它们的大小是 100x100 。但是为什么这个函数工作的很慢呢?大约 2-3 分钟。

for i=1:size(volumes,1)
  for j =1:size(volumes,2)
      ys(i,j) = volumes(i,j)*prices(i,j)

  end
end

如何加快这个操作?

【问题讨论】:

  • 因为这太过分了。只需使用volumes.*prices。不过,循环不应该那么慢......
  • 100x100 矩阵的元素乘法需要 2-3 分钟?奔腾 1 还是 2?
  • 10.000 次乘法需要 2-3 分钟。你的矩阵是什么类型的对象?也许他们的索引运算符做了一些昂贵的事情?

标签: performance matlab matrix vectorization


【解决方案1】:

我认为主要问题是,您忘记了行尾的分号;,您在该处进行计算。因此,您将在命令窗口中显示生成的 100x100 矩阵 ys 10000 次。这可能需要很长时间。 (仍然是 2-3 分钟甚至太多了)。

您还应该预分配 ys。否则ys 的数组大小会随着每次迭代而增长,可能会发生内存不足的情况,需要将ys 复制到内存中的不同位置,这也需要时间。通过预分配,您可以为整个循环预留空间。你可能会觉得this answer很有趣。

因此:

ys = zeros(size(volumes));
for i=1:size(volumes,1)
  for j =1:size(volumes,2)
      ys(i,j) = volumes(i,j)*prices(i,j);
  end
end

它会正常工作的。


但除此之外使用elementwise-multiplication operator .*

ys = volumes.*prices;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2020-03-19
    • 2014-03-12
    • 2012-11-19
    相关资源
    最近更新 更多