Need help removing this for loop

조회 수: 8 (최근 30일)
xtremecheez
xtremecheez 2017년 11월 14일
댓글: Andrei Bobrov 2017년 11월 14일
This is the last step in vectorizing my code, but I just can't see how to get rid of the pesky for loop. Any assistance is appreciated.
I've replaced the variables with numbers for a more readable example.
%size(Cp) = [5,3,100]
%size(Tr) = [2e4,100]
A = zeros(5,2e4,100);
for ii = 1:100
A(:,:,ii) = Cp(:,Tr(:,ii),ii);
end
  댓글 수: 1
Stephen23
Stephen23 2017년 11월 14일
편집: Stephen23 2017년 11월 14일
"I just can't see how to get rid of the pesky for loop. Any assistance is appreciated."
Don't get rid of the loop. Using a loop is probably the neatest, clearest, and most efficient way to solve that task. Anything else will just pointlessly obfuscate your code and waste your time later when you forget what it does.

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

채택된 답변

Walter Roberson
Walter Roberson 2017년 11월 14일
If I got my calculations right, then:
A = Cp( bsxfun(@plus, (1:size(Cp,1)).', bsxfun(@plus, (Tr - 1) * size(Cp,1), ((1:size(Cp,3)-1) * size(Cp,1) * size(Cp,2)) ) );
This is difficult to read and difficult to write. I cannot recommend it unless perhaps run time is very important -- and even then considering the size of the internal matrices involved and the number of operations used to construct them, I would tend to doubt that it is more efficient.
Your existing code with a loop is easier to read and probably nearly as efficient, possibly more efficient.
This is one of those cases where the goal to "vectorize" requires constructing large intermediate arrays and use calculations that have no obvious meaning. Since typically more time is spent programming and debugging and documenting than is spent in execution of a program, it is unlikely that you would be gain anything meaningful by vectorization.
  댓글 수: 2
Jan
Jan 2017년 11월 14일
+1: The large intermediate index array is not efficient.
Walter Roberson
Walter Roberson 2017년 11월 14일
I think I forgot a permute() around the second bsxfun()

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

추가 답변 (1개)

Andrei Bobrov
Andrei Bobrov 2017년 11월 14일
편집: Andrei Bobrov 2017년 11월 14일
[k,m,n] = size(Cp);
A = Cp((1:k)' + k*(permute(Tr,[3 1 2]) - 1)+reshape(0:n-1,1,1,[])*k*m);
  댓글 수: 3
Walter Roberson
Walter Roberson 2017년 11월 14일
It looks to me as if Andrei's code is for R2016b and later.
Andrei Bobrov
Andrei Bobrov 2017년 11월 14일
Yes.

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

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by