MATLAB: Quick vectorization question (for loop)

for loopImage Processing Toolboxstdstdfiltvectorization

Hi
This loop takes about 0.085 seconds to execute and needs to be executed several thousand times. Is there a way you think I can vectorize this? I really appreciate any help!
wsize = 20;
vin = rand(1200,1);
for idx = wsize:length(vin)
mstd(idx-wsize+1, :) = std(vin(idx-wsize+1:idx));
end
PS: I don't have Parallel Processing toolbox.

Best Answer

I hope you are pre-allocating your mstd vector. Other than that, this is about 6 times faster. I didn't compare to stdfilt.
for idx = wsize:length(vin)
x = vin(idx-wsize+1:idx);
x = x-sum(x)./ wsize;
mstd(idx-wsize+1, :) = sqrt(sum(x.^2)/(wsize-1));
end
.
.
.
EDIT add comparison based on IA's recommendation
I find the above to not be faster than using stdfilt when repeatedly run. Here is what I used for comparison:
mstd2 = stdfilt(vin,[0;ones(wsize,1)]);
mstd2 = mstd2(wsize/2:end-wsize/2);
There might be a better way to do this with stdfilt, I have no real experience with the function and had to figure it out based on trial and error and doc reading... Perhaps IA can comment.
Related Question