2

行列AとBがあります

size(A) = [n x]; size(B) = [n y];

次に、Aの各列ベクトルとBの各列ベクトルのユークリッド距離を比較する必要があります。dist現在、メソッドを使用しています。

Q = dist([A B]); Q = Q(1:x, x:end);

しかし、それは多くの不必要な作業も行います(AとBのベクトル間の距離を別々に計算するなど)。

これを計算する最良の方法は何ですか?

4

3 に答える 3

3

あなたが探しているpdist2

% Compute the ordinary Euclidean distance
D = pdist2(A.',B.','euclidean'); % euclidean distance

pdist2観測値が列ではなく行にあると想定しているため、行列の転置を行う必要があります。

于 2013-03-10T17:09:57.490 に答える
1

pdist2統計ツールボックスがない場合の代替ソリューションは、これを手動で計算することです。たとえば、それを行う1つの方法は次のとおりです。

[X, Y] = meshgrid(1:size(A, 2), 1:size(B, 2)); %// or meshgrid(1:x, 1:y)
Q = sqrt(sum((A(:, X(:)) - B(:, Y(:))) .^ 2, 1));

ベクトルの各値からのA、および各値の列のインデックスは、次の計算によって取得できます。BQ

[X(:), Y(:)]

ここで、各行には1組のインデックスが含まれています。最初の行は行列の列インデックスでA、2番目の行は行列の列インデックスBです。

于 2013-03-10T17:30:15.527 に答える
0

pdist2がなく、非常に大きな行列の場合も高速になる可能性がある場合の別の解決策は、次の数学的事実をベクトル化することです。

|| xy || ^ 2 = || x || ^ 2 + || y || ^ 2 --2 * dot(x、y)

ここで||a|| はaのL2ノルム(ユークリッドノルム)です。

コメント:

  1. C = -2 * A'* B(これはax x y行列です)は内積のベクトル化です。
  2. || xy || ^ 2は、探しているユークリッド距離の2乗です。

それで十分ですか、それとも明示的なコードが必要ですか?

これが漸近的に高速になる理由は、代わりにボトルネックを行列乗算にするため、すべてのx * y比較に対してメトリック計算を行わないようにするためです(行列乗算はmatlabで高度に最適化されています)。これはユークリッド距離であり、未知のメトリックだけではないという事実を利用しています。

于 2013-03-10T18:00:45.103 に答える