How to replace for loop with vectorization?

조회 수: 1 (최근 30일)
Hadi Ghahremannezhad
Hadi Ghahremannezhad 2019년 10월 17일
답변: Bruno Luong 2019년 10월 23일
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
Walter Roberson
Walter Roberson 2019년 10월 17일
You can repmat(ii, size(res,2),1) and use res(:)
Sai Bhargav Avula
Sai Bhargav Avula 2019년 10월 23일
repmat may not be the right way as the accumarray is used here.

댓글을 달려면 로그인하십시오.

채택된 답변

Sai Bhargav Avula
Sai Bhargav Avula 2019년 10월 23일
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!

추가 답변 (1개)

Bruno Luong
Bruno Luong 2019년 10월 23일
[iii,jj]=ndgrid(ii,1:size(res,2));
v=accumarray([iii(:) jj(:)], res(:))

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by