i need help vectorizing this loop
9 次查看(过去 30 天)
显示 更早的评论
N = 16;
S = randi(2,[N,N])*2-3;
for l = 1:(N/2-1)
Sl = circshift(S,[l,l]);
f(l) = 1/N*sum(sum(S*Sl.'));
end
0 个评论
回答(1 个)
Adam Danz
2019-4-2
You can't vectorize the circular shift so there's no way to get out of using the for-loop. It's fast, relatively concise, and easy to read so a for-loop isn't a problem here.
If you require that N is an even number, you should include an assumption check to ensure this is always the case instead of just hoping.
% Ensure N is even
if rem(N,2)~=0
error('The value of N is not even.')
end
Also, you should allocate the f variable before the loop.
f = nan(1, N/2-1);
2 个评论
Adam Danz
2019-4-2
编辑:Adam Danz
2019-4-2
I'm not sure how much time this will save but one suggestion is to move the circshift into the sum() function rather than assigning that variable on each iteration.
for l = 1:(N/2-1)
f(l) = 1/N*sum(sum(S * circshift(S,[l,l]).'));
end
I have a custom function that compares timing between two sets of code and performs statistics to determine if one is faster. For what it's worth, I timed both versions (one with cirshift embedded and one with circshift separate) and ran it 1 million times each. The embedded version was 1.054 times faster and saved less than 0.0001 seconds (p=0.000, wilcox rank sum). So there was barely a difference. Each for-loop consumed ~0.00005 sec on average.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!