Vectorize loop to speed up
古いコメントを表示
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.
Thanks in advance.
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
5 件のコメント
Jan
2022 年 5 月 16 日
It would be very useful, if you provide some input data, e.g. created by rand(). It is hard to optimize some coe without running it. It would not be efficient, if anyone, who tries to answer your question, starts to write soe code to invent input data. So this is your turn.
Matt J
2022 年 5 月 16 日
the outer loop 'flow' to 'fhigh' is 1:1:150
Why are omega and FFT{j} of length 5000 if only 150 of their elements are used in the loop?
Kamran
2022 年 5 月 16 日
Kamran
2022 年 5 月 20 日
回答 (2 件)
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}) );
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.
カテゴリ
ヘルプ センター および 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!