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