Search code examples
matlabmatrixcross-correlation

xcorr between two matrices


I have a question on xcorr function in MATLAB.

Currently this function can calculate the autocorrelation of a matrix, but cannot calculate the cross-correlation of 2 matrices:

A=[1,2;3,4];
B=[5,6;7,8];

xcorr(A); %% Possible
xcorr(A,A); %% Not Possible
xcorr(A,B); %% Not Possible

Are you aware of any workaround to do this, but without using a for loop?


Solution

  • xcorr has essentially two syntaxes.

    c = xcorr(x, y)
    

    computes the cross-correlation function between two scalar signals (given as vectors), and

    c = xcorr(x)
    

    computes the auto-correlation function of a signal if x is a vector, and the auto- and cross-correlation functions between all columns of x if it is a matrix. If x is of size n x p, then c is of size 2*n-1 x p^2.

    When you write

    c = xcorr(x, y);
    

    with two matrices x and y, I assume you want the cross-correlation functions between all signals in x with all signals in y. xcorr can't do this out of the box. However, if the two matrices both have n rows, you can write

    c = xcorr([x, y]);
    

    to get the auto- and cross-correlation functions between all signals that are in x or y. c is of size 2*n-1 x (p1+p2)^2, where p1 and p2 are the numbers of signals (columns) in the two matrices. You can then reshape and truncate the result:

    c = reshape(c, 2*n-1, p1+p2, p1+p2);
    c = c(:, 1 : p1, p1+1 : end);
    

    The result is a three-dimensional matrix where the first dimension corresponds to the lag, the second enumerates the signals in x and the third enumerates the signals in y; its size is 2*n-1* x p1 x p2.