【问题标题】:Matlab:Xcorr operation without using for loopsMatlab:不使用 for 循环的 Xcorr 操作
【发布时间】:2017-02-22 13:10:50
【问题描述】:

我有两个矩阵 A(2*1600*3) 和 B(2*1600)。我正在尝试针对 B 中的每一行对 A 中的每一行进行 xcorr 操作,并希望将结果存储在矩阵中。目前我正在使用以下代码。

for ii=1:3
    for jj=1:2
       X(ii,jj)=max((xcorr(A(jj,:,ii),B(jj,:)))); 
    end
end

因为我使用了两个 for 循环,所以它会消耗更多的时间,并且会影响我已经有一个 for 循环的整个程序的执行时间。如果没有两个 for 循环,我该如何做到这一点并将输出存储在矩阵中?

同时,我还用 cellfun 尝试了上面的代码,用于输出矩阵的单列。

`cellfun(@(x) max(xcorr(x, B(1,:))), A, 'UniformOutput', false);`

在我的观察中,for 循环比 cellfun 快得多。 执行次数: For 循环:两列矩阵输出为 2.4 秒。 Cellfun:一列矩阵输出需要 2.6 秒。

【问题讨论】:

    标签: matlab correlation


    【解决方案1】:

    您可以使用fft 轻松完成此操作。互相关与卷积非常相似:

    % Compute the size of the cross-correlation.
    N = size(A,2) + size(B,2) - 1;
    % Do correlation using FFT.  We have to flip one of the inputs.
    % If A and B are both symmetric, you might want to add the 'symmetric' flag to ifft
    Y = ifft(fft(A,N,2) .* fft(flip(B,2),N,2), N, 2);
    % Squeeze out the second dimension and transpose so it matches your size and shape.
    Y = squeeze(max(Y, [], 2))'
    

    【讨论】:

    • 您好 Sardar,感谢您的回复,由于矩阵 A 和 B 的维度不一样,所以还需要一个 for 循环。
    • 是的,这个例子使用了 R2016b 的隐式标量扩展。如果您有早期版本的 MATLAB,则可以在第二行使用 bsxfun 代替:Y = ifft(bsxfun(@times, fft(A,N,2) fft(flip(B,2),N,2), N, 2));
    • 嗨 CKT,当我尝试执行上述命令时,我收到以下错误消息,“未定义函数 'fft' 用于类型为 'cell' 的输入参数”。
    • 嗨 CKT,我的错误是我为 A 和 B 使用了错误的值。无论如何,上面的行不起作用。您在第一个 fft 之后错过了一个逗号,第二个 fft 也不一致。
    • 对不起;那应该是Y = ifft(bsxfun(@times, fft(A,N,2), fft(flip(B,2),N,2)), N, 2);。同样,这假设 size(A) = [ 2 1600 3 ]size(B) = [ 2 1600 ]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多