矢量化3D任务

时间:2018-03-08 09:15:41

标签: matlab for-loop vectorization

是否可以进行矢量化(在没有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

2 个答案:

答案 0 :(得分:1)

您可以通过拨打reshape来轻松地对此进行矢量化:

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

首先将A的每一行依次放入一个行向量(大小为1乘15),用它索引B(得到一个1000乘15的矩阵),然后将B重塑为3-D矩阵。

答案 1 :(得分:1)

如果您想通过一次调用reshape来对其进行矢量化:

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

与其他人在评论中提到的一样,这实际上并没有为您节省大量的计算时间。当我运行1000次原始实现和我的试验时,循环时间为4.8264e-05秒,而矢量化版本则为3.1495e-05秒。

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

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