How to replace for loop with vectorization?
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hadi Ghahremannezhad
le 17 Oct 2019
Réponse apportée : Bruno Luong
le 23 Oct 2019
Is there any way I can replace this for loop with a vectorized approach?
v = zeros(4, 3);
ii = [1 ; 2 ; 3 ; 1 ; 3 ; 4];
res = [-1 -1 1 ; -1 -1 1 ; -1 -1 1 ; 1 1 -1 ; 1 1 -1 ; -1 1 -1];
for i = 1:3
v(:,i) = accumarray(ii , res(:,i));
end
I know if res was just scalar values, I could use this:
v= accumarray(ii , res);
But is it posible to remove the loop knowing that res has more than one columns?
2 commentaires
Réponse acceptée
Sai Bhargav Avula
le 23 Oct 2019
Hi,
You can eliminate the for loop by using the code below.
ii = [1 ; 2 ; 3 ; 1 ; 3 ; 4];
res = [-1 -1 1 ; -1 -1 1 ; -1 -1 1 ; 1 1 -1 ; 1 1 -1 ; -1 1 -1];
[x, y] = ndgrid(ii,1:size(res,2));
v=accumarray([x(:) y(:)],res(:));
But I would recommend to use the for loop if the size of the matrix is small.
In the above case
The elapsed time in the case of for loop is 0.000248 sec. Where as in the case of where for loop is eliminated the elapsed time is 0.000750 sec.
Hope this helps!
0 commentaires
Plus de réponses (1)
Bruno Luong
le 23 Oct 2019
[iii,jj]=ndgrid(ii,1:size(res,2));
v=accumarray([iii(:) jj(:)], res(:))
0 commentaires
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements 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!