How to efficiently generate a new array by indexing an array with another array
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Paolo Binetti
le 3 Jan 2017
Commenté : Walter Roberson
le 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 commentaires
Réponse acceptée
Walter Roberson
le 3 Jan 2017
L = l; %make it easier to distinguish lower-case L
C = B(sub2ind(size(B), A(:,:,k), repmat( 1:m, L, 1) ));
2 commentaires
Walter Roberson
le 4 Jan 2017
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
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!