行列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のベクトル間の距離を別々に計算するなど)。
これを計算する最良の方法は何ですか?
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
、および各値の列のインデックスは、次の計算によって取得できます。B
Q
[X(:), Y(:)]
ここで、各行には1組のインデックスが含まれています。最初の行は行列の列インデックスでA
、2番目の行は行列の列インデックスB
です。
pdist2がなく、非常に大きな行列の場合も高速になる可能性がある場合の別の解決策は、次の数学的事実をベクトル化することです。
|| xy || ^ 2 = || x || ^ 2 + || y || ^ 2 --2 * dot(x、y)
ここで||a|| はaのL2ノルム(ユークリッドノルム)です。
コメント:
それで十分ですか、それとも明示的なコードが必要ですか?
これが漸近的に高速になる理由は、代わりにボトルネックを行列乗算にするため、すべてのx * y比較に対してメトリック計算を行わないようにするためです(行列乗算はmatlabで高度に最適化されています)。これはユークリッド距離であり、未知のメトリックだけではないという事実を利用しています。