加速 3D 数组乘法



我有以下代码片段,它将 3D 数组的每个 2D 横截面乘以一个向量:

A = zeros(N,M);
for k = 1:M
   B = C(:,:,k);
   A(:,k) = B * f(:,k);
end

当我分析代码时,我看到对于 N=200,M = 25,这可能非常慢(相对于我代码的其他部分);特别是行:

B=C(:,:,k)

可能占用总运行时间的很大一部分。有什么方法可以加快速度吗?

您可以将bsxfunpermute结合使用,以执行具有单例扩展的所需乘法,然后沿适当的维度相加以计算矩阵乘法。

定义示例数据:

N = 5;
M = 4;
C = rand(N,N,M);
f = rand(N,M);

然后结果计算为

result = permute(sum(bsxfun(@times, C, permute(f,[3 1 2])),2), [1 3 2]);

作为检查,与使用循环计算的结果进行比较:

A = zeros(N,M);
for k = 1:M
   B = C(:,:,k);
   A(:,k) = B * f(:,k);
end
result./A

ans =
     1     1     1     1
     1     1     1     1
     1     1     1     1
     1     1     1     1
     1     1     1     1

相关内容

  • 没有找到相关文章

最新更新