MATLAB Answers

0

How to efficiently generate a new array by indexing an array with another array

Asked by Paolo Binetti on 3 Jan 2017
Latest activity Commented on by Walter Roberson
on 4 Jan 2017
Is there a faster way to implement this loop, maybe vectorizing it?
for j = 1:m
C(:,j) = B(A(:,j,k),j);
end
where:
A is a l x m x n 3-D array of int from 1 to 4
B is a p x m 2-D array of doubles
C is a l x m 2-D array of doubles
l = order of 1000 ; m = order of 10 ; n = order of 100 ; p = 4

  2 Comments

Sorry, I forgot: k is an index from 2 to n Indeed, the piece of code above is inside a "k" for-loop

Sign in to comment.

1 Answer

Answer by Walter Roberson
on 3 Jan 2017
 Accepted Answer

L = l; %make it easier to distinguish lower-case L
C = B(sub2ind(size(B), A(:,:,k), repmat( 1:m, L, 1) ));

  2 Comments

Thank you: your solution is about 5-10 faster, which is good enough for me, as long as I compute
repmat( 1:m, L, 1)
only once and not inside the k-for-loop that contains this piece of code.
Yes, that is a good idea, to move that computation outside the loop.
If you have R2016b or later it can be improved even more:
C = B( (A(:,:,k) - 1) * p + (1:m) )
and the 1:m could be assigned to a variable before the loop

Sign in to comment.