Could you let me know how to vectorize the below for-loop ?
pigrid = zeros(knum,epnum,sepnum,znum,sznum);
for ki = 1:knum
for epi = 1:epnum
for sepi = 1:sepnum
for zi = 1:znum
for szi = 1:sznum
pigrid(ki,epi,sepi,zi,szi) = epgrid(epi,sepi)*zgrid(zi,szi)*kgrid(ki)^alpha-f;
end
end
end
end
end

9 件のコメント

Adam Danz
Adam Danz 2018 年 8 月 6 日
Please provide values of knum,epnum,sepnum,znum,sznum. If the current nested loop strategy works, why do you need to vectorize it? Assuming epgrid, zgrid, and kgrid and matricies, this should be really fast.
Stephen23
Stephen23 2018 年 8 月 6 日
matwork's "Answer" moved here:
Thanks for your response.
knum=100,epnum=10,sepnum=5,znum=10,sznum=5
Yes. The code works and doesn't take much time. Just I want to see if vectorization helps save time.
Adam Danz
Adam Danz 2018 年 8 月 6 日
編集済み: Adam Danz 2018 年 8 月 6 日
Here's what I got so far. It's a simplification but still relies on 3 of your 5 loops.
for ki = 1:knum
for epi = 1:epnum
for sepi = 1:sepnum
pigrid(ki,epi,sepi,:,:) = epgrid(epi,sepi)*zgrid(1:znum,1:sznum)*kgrid(ki)^alpha-f;
end
end
end
if zgrid(1:znum,1:sznum) == zgrid, then a further simplification would be
for ki = 1:knum
for epi = 1:epnum
for sepi = 1:sepnum
pigrid(ki,epi,sepi,:,:) = epgrid(epi,sepi)*zgrid*kgrid(ki)^alpha-f;
end
end
end
Further vectorization would require a few repmat() and reshape() function calls to store the results in your current 5D variable and I'm not sure you're going to save time by doing that. Nevertheless, I'd love to see a complete vectorization of this from someone who has more time to fiddle with it.
icdi
icdi 2018 年 8 月 6 日
Thanks! Your code works and is simpler than mine. This helps me.
OCDER
OCDER 2018 年 8 月 6 日
Moved from Answers to here.
"Thanks for your response. znum is not 10 but 7. Sorry about my typo."
In that case, my other answer wouldn't have worked... hm... The only way I can see this loop go faster is to move the
kgrid(ki)^alpha
outside the nested loops to prevent recalculating this value many times.
OCDER
OCDER 2018 年 8 月 6 日
By the way, just realized your ID name is "matwork" with a mathworks logo. Perhaps try changing your ID and logo so that it does not seem to impersonate MathWorks employees.
icdi
icdi 2018 年 8 月 6 日
Oh I see. Thanks for your comment.
OCDER
OCDER 2018 年 8 月 6 日
No problem. And make sure to accept @Adam's answer, once he copies it over to the Answer section :)
icdi
icdi 2018 年 8 月 6 日
Yes yes. Thanks again for your advice!

サインインしてコメントする。

 採用された回答

Adam Danz
Adam Danz 2018 年 8 月 6 日

0 投票

Creating a fully vectorized version of these nested loops seems either not possible or not practical. Here's a summary of some improvements listed in the comment section under the question.
This simplification still relies on 3 of your 5 loops.
for ki = 1:knum
for epi = 1:epnum
for sepi = 1:sepnum
pigrid(ki,epi,sepi,:,:) = epgrid(epi,sepi)*zgrid(1:znum,1:sznum)*kgrid(ki)^alpha-f;
end
end
end
if zgrid(1:znum,1:sznum) == zgrid, then a further simplification would be
for ki = 1:knum
for epi = 1:epnum
for sepi = 1:sepnum
pigrid(ki,epi,sepi,:,:) = epgrid(epi,sepi)*zgrid*kgrid(ki)^alpha-f;
end
end
end
@OCDER also recommended moving kgrid(ki)^alpha outside of the loop which would eliminate ~10000 exponential calculations.
Assuming kgrid(1:knum)==kgrid,
kgalpha = kgrid.^alpha; % or kgrid(1:knum).^alpha
for ki = 1:knum
for epi = 1:epnum
for sepi = 1:sepnum
pigrid(ki,epi,sepi,:,:) = epgrid(epi,sepi)*zgrid*kgalpha(ki)-f;
end
end
end
Lastly, you could remove the " -f" to after the loop like this:
kgalpha = kgrid.^alpha; %or kgrid(1:knum).^alpha
for ki = 1:knum
for epi = 1:epnum
for sepi = 1:sepnum
pigrid(ki,epi,sepi,:,:) = epgrid(epi,sepi)*zgrid*kgalpha(ki);
end
end
end
pigrid = pigrid - f;

2 件のコメント

Adam Danz
Adam Danz 2018 年 8 月 6 日
編集済み: Adam Danz 2018 年 8 月 6 日
All of these versions have been tested with fake data where epgrid, zgrid, and kgrid were matrices with random numbers and the loop variables used the values you shared above. Additionally, you should test your current nested loop code with the simplified version you choose to ensure you've got the same values. To do that, you could use
isequal(pigrid, pigrid2).
icdi
icdi 2018 年 8 月 6 日
Oh Thanks! I learned a lot from your comments. Also thanks for letting me know the way to compare the versions.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeLoops and Conditional Statements についてさらに検索

質問済み:

2018 年 8 月 6 日

コメント済み:

2018 年 8 月 6 日

Community Treasure Hunt

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

Start Hunting!

Translated by