i need help vectorizing this loop

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

Answers (1)

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 Comments

the reason why i was trying to avoid the for loop i because i am running a montecarlo simulation of a 2-d ising model with 1e6 mc steps, so every microsecond counts here.
if i write a function i will be sure to include it.
i made sure to do that in the original code and just forgot to put it here.
thank you for your response !
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.

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Release

R2018a

Asked:

on 2 Apr 2019

Edited:

on 2 Apr 2019

Community Treasure Hunt

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

Start Hunting!