# Vectorize loop to speed up

1 view (last 30 days)
Kamran on 16 May 2022
Commented: Kamran on 20 May 2022
Hi,
This segment of code takes 13 seconds to run and as it runs hundreds of times it needs to be drastically speed optimized. Wonder if it can be done. Parallelizing the loop doesn't seem to help much.
Parameters are:
tau is a cell array of 384 each a matrix of 202 x 202 double elements.
FFT is a cell array of 384 each a vector of 5000 double elements.
omega is a vector of doubles of length 5000.
the outer loop 'flow' to 'fhigh' is 1:1:150
Converting cell arrays to arrays helps only slightly.
P=zeros(size(tau{1}));
for k=flow:fhigh
F=zeros(size(tau{1}));
for j=1:nchan
F=F+FFT{j}(k)*exp(i*omega(k)*tau{j});
end
F=F.*conj(F);
P=P+F;
end
Kamran on 20 May 2022
Sorry for the late answer. Need to generate some data first. Get back later.

Matt J on 16 May 2022
Edited: Matt J on 16 May 2022
Fcell=cellfun(@(x)x(:),FFT,'uni',0);
Fmat=cell2mat(Fcell(:)');
Tau=cellfun(@(x)x(:)',tau,'uni',0);
Tmat=cell2mat(Tau(:));
P=0;
for k=flow:fhigh
F=abs( Fmat(k,:)*exp((1i*omega(k)).*Taumat) ).^2;
P=P+F;
end
P=reshape(P, size(tau{1}) );
##### 2 CommentsShowHide 1 older comment
Matt J on 16 May 2022
You might try again with a parfor-loop, but with the simplified loop implementation above. In this form, it might be easier for parfor to slice.

Matt J on 16 May 2022
Edited: Matt J on 16 May 2022
The operations look like IFFTs, though possibly you have irregular time and frequency sampling. Even so, you should possibly consider a compromise where you take the IFFT with pre- and post-interpolation to get the sampling that you need.
Kamran on 16 May 2022
Yes, the sampling is irregular so I have to do it this way. Thanks for the help.

R2021b

### Community Treasure Hunt

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

Start Hunting!