我有一个很大的矩阵300000,64我需要独立于所有其他行的每一行的自相关结果将为[300000,127]我是这样做的
for i = 1:rw xcorrresults(i,:) = xcorr(tests(i,:)); end
但它占用了整个程序的大部分时间。有没有办法将循环矢量化?
5fjcxozz1#
您可以通过预先分配输出来节省大量的运行时间(您的输入越大,就越重要)
xcorrresults2 = zeros(rw,2*cl-1); for i = 1:rw xcorrresults2(i,:) = xcorr(tests(i,:)); end
在内部,xcorr将所有内容作为列数组处理,如果给它一行,则执行一些额外的操作。(令人惊讶的是)把它放在专栏前面又为我节省了35%
xcorr
xcorrresults3 = zeros(rw,2*cl-1); for i = 1:rw xcorrresults3(i,:) = xcorr(tests(i,:).').'; end
如果需要,可以使用profile向下钻取xcorr函数。例如,对于我来说,大约20%的运行时用于该函数的内部循环来确定转换长度-如果您的数据是固定大小,则可以一次性确定,如果您创建了类似的自定义函数,则可以将其用作输入。
profile
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秒左右完成。现在更像是这样了..
pbwdgjma3#
这一计算已经很繁重,但幸运的是,xcorr的MATLAB算法足够高效,它在内部使用fft。在4核计算机上使用并行化仍然可以获得近4倍的加速比。只需使用parfor而不是for,并使用转置数组以最佳内存顺序逐列工作。
fft
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
3条答案
按热度按时间5fjcxozz1#
您可以通过预先分配输出来节省大量的运行时间(您的输入越大,就越重要)
在内部,
xcorr
将所有内容作为列数组处理,如果给它一行,则执行一些额外的操作。(令人惊讶的是)把它放在专栏前面又为我节省了35%如果需要,可以使用
profile
向下钻取xcorr
函数。例如,对于我来说,大约20%的运行时用于该函数的内部循环来确定转换长度-如果您的数据是固定大小,则可以一次性确定,如果您创建了类似的自定义函数,则可以将其用作输入。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秒左右完成。
现在更像是这样了..
pbwdgjma3#
这一计算已经很繁重,但幸运的是,
xcorr
的MATLAB算法足够高效,它在内部使用fft
。在4核计算机上使用并行化仍然可以获得近4倍的加速比。只需使用parfor
而不是for
,并使用转置数组以最佳内存顺序逐列工作。