【问题标题】:How can I speed up this array multiplication?我怎样才能加快这个数组乘法?
【发布时间】:2015-08-24 17:26:42
【问题描述】:
for i = 1:N
    for j = 1:M
        for c = 1:3
            A(:,:,c,i) = A(:,:,c,i).*B(:,:,j);
        end
    end
end

例如,是否可以通过矢量化来消除最内层的循环?

【问题讨论】:

  • 您的代码正确吗? j 循环没有用,只有值 j=M 存在。使用您的代码,您可以删除第二个循环并设置 j=M;
  • 哦,j 循环没问题,变量名不正确,我现在修复了,谢谢。
  • 同样的问题。只有j=M真正被使用! j 的其他值的结果被覆盖

标签: matlab optimization multidimensional-array vectorization matrix-multiplication


【解决方案1】:

首先,您可以通过预乘矩阵来消除 j 上的循环:

B2 = prod(B, 3); % Element-wise product along third dim

for i = 1:N
    for c = 1:3
        A(:,:,c,i) = A(:,:,c,i) .* B2;
    end
end

然后您可以使用 repmat 将 Matrix B2 平铺并消除其他两个循环。我很难理解 4D 矩阵,但它应该是这样的:

B2 = prod(B, 3); % Element-wise product along third dim
B3 = repmat(B2, [1 1 3 N]);
A = A .* B3;

或者(甚至更好)使用 bsxfun:

B2 = prod(B, 3); % Element-wise product along third dim
A = bsxfun(@times, A, B2);

bsxfun 将使用更少的内存,因为它“虚拟复制”了 B2。

【讨论】:

  • 嗯,这不一样,如果B2i 循环内并且看起来像这样B2 = prod(B(:,:,i-1), 3); 应该会加快程序的速度谢谢你,但现在如何我应该为此使用 repmat 吗?
  • @ĬnfernalSeraphím:除了浮点精度错误外,输出是相同的。在数学层面上,代码的作用完全相同。
  • 我会使用A=bsxfun(@times,A,B2); 而不是repmat
  • 确实,这可能是更好的做法。我已经合并了 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 2014-08-13
  • 2020-01-03
  • 2021-11-21
  • 2021-08-01
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多