Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MATLAB: Matrix of pairwise differences

I have a Nx1 vector of values. What I would like to do is create a NxN matrix where each value represents the difference between the ith and jth value - sort of like a large correlation matrix. I've done with this with a loop but I'm looking for a more elegant way to approach using MATLAB's vectorization capabilities as this vector may get quite large.

like image 305
Jason Strimpel Avatar asked Nov 16 '12 18:11

Jason Strimpel


2 Answers

what about

    diff__ = bsxfun(@minus,repmat(A,N,1),A');

which can be definitely improved by doing

    diff__ = bsxfun(@minus,A,A');

?

A little performance check:

   N = 1000;
   v = rand(N,1);

   tic
   diff__ = bsxfun(@minus,repmat(v,N,1),v');
   toc

   tic
   diff__ = bsxfun(@minus,v,v');
   toc

result

  Elapsed time is 105.343344 seconds.
  Elapsed time is 1.124946 seconds.

(Tim's data check:

diff__ =

 0     2     6     4
-2     0     4     2
-6    -4     0    -2
-4    -2     2     0

).

like image 96
Acorbe Avatar answered Oct 11 '22 18:10

Acorbe


meshgrid can generate matrices fit for this purpose. Obtain the difference matrix with

meshgrid(v) - meshgrid(v)'

Example:

>> v = [1 3 7 5]

v =

     1     3     7     5

>> meshgrid(v)

ans =

     1     3     7     5
     1     3     7     5
     1     3     7     5
     1     3     7     5

>> meshgrid(v) - meshgrid(v)'

ans =

     0     2     6     4
    -2     0     4     2
    -6    -4     0    -2
    -4    -2     2     0

>> 
like image 34
Tim Avatar answered Oct 11 '22 18:10

Tim