【问题标题】:Speedup 3D array multiplication加速 3D 数组乘法
【发布时间】:2016-11-10 01:01:49
【问题描述】:

我有以下代码 sn-p,它将 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)

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

【问题讨论】:

  • 请发布可运行代码。什么是Cf
  • C 是 NxNxM 数组,f 是 NxM 数组

标签: matlab multidimensional-array vectorization


【解决方案1】:

您可以将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

【讨论】:

  • 这个方案操作比较多,我觉得这个方法不会更快。
  • @obchardon 我认为基本乘法和加法的数量是相同的。但是是的,它可能会更慢,特别是因为permute
  • 我对我的问题进行了测试。对于 N=192,M=25,它的运行速度稍慢。
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多