【问题标题】:Vectorize 3D assignment矢量化 3D 分配
【发布时间】:2018-03-08 09:15:41
【问题描述】:

是否可以矢量化(不使用 for 循环也一样)这个问题?

A=[(1:5)' (1:5)' (1:5)'];
B=ones(1000,5);

D=size(A,1)
C=zeros(1000,3,5)

for y=1:D
C(:,:,y)=B(:,A(y,:));
end

【问题讨论】:

  • 您使用什么编程语言? MATLAB?
  • Matlab。立即添加标签。
  • 你总是可以牺牲内存并做repmat。不过我认为这是一个很好的方法,不一定比使用repmat
  • 矩阵 A 可以有 1 到 5 之间的随机数。矩阵 B 可以有完全随机数。
  • 除非它是你程序的瓶颈,否则不要向量化东西。并且总是在之前和之后测量。在最新版本的 MATLAB 中,矢量化代码不一定比循环快。

标签: matlab for-loop vectorization


【解决方案1】:

您可以通过调用reshape 轻松地将其矢量化:

C = reshape(B(:, reshape(A.', [], 1)), size(B, 1), [], size(B, 2));

这首先将A 的每一行按顺序放入行向量(大小为 1×15),用它索引 B(产生 1000×15 矩阵),然后重塑 B到一个 3-D 矩阵。

【讨论】:

    【解决方案2】:

    如果您想通过调用 reshape 将其矢量化:

    C = reshape((B(:,A')),1000,3,5);
    

    就像其他人在 cmets 中提到的那样,这实际上并没有为您节省太多计算时间。当我对您和我的原始实现进行 1000 次试验时,循环耗时 4.8264e-05 秒,而矢量化版本耗时 3.1495e-05 秒。

    如果您要扩大问题的规模,并将 B=ones(1000,5); 替换为 B=ones(1000000,5);,则循环的执行时间为 0.0855 秒,向量化版本的执行时间为 0.0611 秒,两次调用 reshape,0.0605 秒为我在这里发布的矢量化版本。随着问题的扩大,节省的时间会更多一些,但同样,这可能不是一个有意义的差异。

    编辑:上面列出的时序适用于 MATLAB 版本 (R2016a)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 2015-02-21
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      相关资源
      最近更新 更多