MATLAB Answers

0

How to replace for loop with vectorization?

Asked by Hadi Ghahremannezhad on 17 Oct 2019
Latest activity Answered by Bruno Luong
on 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 Comments

You can repmat(ii, size(res,2),1) and use res(:)
repmat may not be the right way as the accumarray is used here.

Sign in to comment.

2 Answers

Answer by Sai Bhargav Avula on 23 Oct 2019
 Accepted Answer

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 Comments

Sign in to comment.


Answer by Bruno Luong
on 23 Oct 2019

[iii,jj]=ndgrid(ii,1:size(res,2));
v=accumarray([iii(:) jj(:)], res(:))

  0 Comments

Sign in to comment.