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