8

値の Nx1 ベクトルがあります。私がやりたいのは、各値が i 番目と j 番目の値の差を表す NxN 行列を作成することです。これは、大きな相関行列のようなものです。ループでこれを実行しましたが、このベクトルが非常に大きくなる可能性があるため、MATLAB のベクトル化機能を使用してアプローチするより洗練された方法を探しています。

4

3 に答える 3

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

)。

于 2012-11-16T18:55:17.597 に答える
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

>> 
于 2012-11-16T18:53:04.070 に答える
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
于 2012-11-16T19:08:32.323 に答える