MATLAB:成对差异的矩阵

时间:2012-11-16 18:49:59

标签: arrays matlab matrix

我有一个Nx1值的向量。我想要做的是创建一个NxN矩阵,其中每个值代表第i个和第j个值之间的差异 - 有点像一个大的相关矩阵。我已经完成了循环,但我正在寻找一种更优雅的方法来使用MATLAB的矢量化功能,因为这个矢量可能会变得非常大。

3 个答案:

答案 0 :(得分:12)

怎么样

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

可以明显改善

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

进行一点性能检查:

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

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

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

结果

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

(蒂姆的数据检查:

diff __ =

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

)。

答案 1 :(得分:7)

meshgrid可以生成适合此目的的矩阵。用

获得差异矩阵
meshgrid(v) - meshgrid(v)'

示例:

>> 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

>> 

答案 2 :(得分:0)

已经给出了很好的答案。但要加入乐趣,这是另一种方式(使用Tim数据)

v=[1 3 7 5];
 cell2mat(arrayfun(@(i) (v(i)-v)',1:size(v,2), 'UniformOutput',false))

ans =

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