【问题标题】:MATLAB: Matrix of pairwise differencesMATLAB:成对差异矩阵
【发布时间】:2012-11-16 18:49:59
【问题描述】:

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

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    怎么样

        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.
    

    (蒂姆的数据检查:

    差异__ =

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

    )。

    【讨论】:

    • 比 Tim 使用 1000 个元素向量的方法测试更快。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      已经给出了很好的答案。但是为了凑热闹,这里有另一种方式(使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 2019-04-10
        • 1970-01-01
        相关资源
        最近更新 更多