- Did you pre-allocate the output array b ?
- Also, have you considered that MATLAB stores arrays column-major, so that your code might be faster and more efficient if you used the transpose of a, even though it is still in a for loop?
autocorrelate rows of matrix without using a for loop
2 ビュー (過去 30 日間)
古いコメントを表示
Hello, can anyone help me to write 'vectorized' code to compute the autocorrelation of each row of a matrix without using a for loop? My current code computes the autocorrelation of the rows like this:
for m=1:10
b(m,:)=xcorr( a(m,:) );
end
This is slow and inefficient. There must be a better way? Thanks, -Cody
0 件のコメント
回答 (6 件)
Rick Rosson
2011 年 8 月 25 日
Hi Cody,
Can you please answer the following questions?
Thanks!
Rick
0 件のコメント
Sean de Wolski
2011 年 8 月 25 日
for m=10:-1:1
b(m,:)=xcorr( a(m,:) );
end
5 件のコメント
Sean de Wolski
2011 年 8 月 26 日
Honglei explained it well, it dynamically preallocates b to have m rows of length(xcorr(a(m,:))) so basically getting you the speed gain of calling zeros before hand
b = zeros(m,length_of_2nd_dim);
for ii = 1:m
%do stuff
end
A few months ago Matt Fig showed dynamically preallocating, as I did a above, to sometimes be faster than preallocating the conventional way. I can't seem to find that question though :(
Rick Rosson
2011 年 8 月 25 日
Also, please check the documentation for xcorr:
>> doc xcorr
It looks like you may be able to accomplish what you want without a for loop if you first transpose a and then consider each column of a as an independent channel.
HTH.
Rick
Honglei Chen
2011 年 8 月 25 日
You can use FFT if your data is large, e.g.,
ffta = fft(a,NFFT,2);
b = fftshift(ifft(ffta.*conj(ffta),[],2),2)
Choose your NFFT as 2*size(a,2)-1 to match xcorr behavior. You may gain even more if you can transpose your data first to make these function working along columns.
HTH
2 件のコメント
Rick Rosson
2011 年 8 月 25 日
Is the issue here that you really need to make this code run faster, or is it that you are just hoping to find a more elegant (e.g. vectorized) way to accomplish this task without resorting to a for loop?
How much time is it taking to run this code now? How fast do you need it to be?
2 件のコメント
Chaowei Chen
2011 年 8 月 27 日
The idea is to convert mat to cell since each row is independent. After processing, convert cell back to mat.
a2=mat2cell(a,ones(1,size(a,1)),size(a,2));
b2=cellfun(@xcorr,a2,'uniformoutput',false);
b2=cell2mat(b2);
isequal(b,b2)
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Pulsed Waveforms についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!