matlab 如何逐行向量化矩阵的自相关

y1aodyip  于 2022-11-15  发布在  Matlab
关注(0)|答案(3)|浏览(210)

我有一个很大的矩阵300000,64
我需要独立于所有其他行的每一行的自相关
结果将为[300000,127]
我是这样做的

for i = 1:rw
    xcorrresults(i,:) = xcorr(tests(i,:));
end

但它占用了整个程序的大部分时间。
有没有办法将循环矢量化?

5fjcxozz

5fjcxozz1#

您可以通过预先分配输出来节省大量的运行时间(您的输入越大,就越重要)

xcorrresults2 = zeros(rw,2*cl-1);
for i = 1:rw
    xcorrresults2(i,:) = xcorr(tests(i,:));
end

在内部,xcorr将所有内容作为列数组处理,如果给它一行,则执行一些额外的操作。(令人惊讶的是)把它放在专栏前面又为我节省了35%

xcorrresults3 = zeros(rw,2*cl-1);
for i = 1:rw
    xcorrresults3(i,:) = xcorr(tests(i,:).').';
end

如果需要,可以使用profile向下钻取xcorr函数。例如,对于我来说,大约20%的运行时用于该函数的内部循环来确定转换长度-如果您的数据是固定大小,则可以一次性确定,如果您创建了类似的自定义函数,则可以将其用作输入。

axkjgtzd

axkjgtzd2#

我怀疑运行时间长是因为在单独的调用中对我的所有样本序列执行xcorr的调用开销。
我尝试了上面的克丽丝建议。
首先,我转置了我的数组,这样信号实现就在有很多行的列中。然后用零填充,这样FFT就是线性的。
然后对此进行快速傅立叶变换。在倍频程中,矩阵的快速傅立叶变换对列起作用。
然后对FFT结果的乘积与其共轭进行IFFT
测试=[零(RW,64)测试];%填充
T=FFT(测试‘);
P=fftShift(abs(ifft(T.*conj(T)‘;
对每个样本使用Xcorr,通常需要检查30000个序列,时间为19秒。
使用IFFT(FFT(X).*CONJ(FFT(X))通常在0.35秒左右完成。
现在更像是这样了..

pbwdgjma

pbwdgjma3#

这一计算已经很繁重,但幸运的是,xcorr的MATLAB算法足够高效,它在内部使用fft。在4核计算机上使用并行化仍然可以获得近4倍的加速比。只需使用parfor而不是for,并使用转置数组以最佳内存顺序逐列工作。

clc, clear
tests = ones(300000, 64)';
[m, n] = size(tests);
xcorrresults = zeros(2*m-1, n);
parfor i = 1:n
    xcorrresults(:,i) = xcorr(tests(:,i));
end

相关问题