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

1 visualizzazione (ultimi 30 giorni)
Paolo Binetti il 3 Gen 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 CommentiMostra NessunoNascondi Nessuno
Jan il 3 Gen 2017
What is "k"?
Paolo Binetti il 3 Gen 2017
Sorry, I forgot: k is an index from 2 to n Indeed, the piece of code above is inside a "k" for-loop

Accedi per commentare.

Risposta accettata

Walter Roberson il 3 Gen 2017
L = l; %make it easier to distinguish lower-case L
C = B(sub2ind(size(B), A(:,:,k), repmat( 1:m, L, 1) ));
2 CommentiMostra NessunoNascondi Nessuno
Paolo Binetti il 3 Gen 2017
Modificato: Paolo Binetti il 3 Gen 2017
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.
Walter Roberson il 4 Gen 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

Accedi per commentare.

Categorie

Scopri di più su Matrix Indexing in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by