2

私はオクターブで次のコードを持っています:

dist=0;
for i = 1:length(x);        
    for j = 1:length(y);
        v  = x(i,:) - y(j,:);
        distvect(j) = norm(v);
    endfor 
    dist = dist + min(distvect);
endfor

ここで、x と y はサイズ nx 2 と mx 2 の行列です。私の主な問題: 上記のコードを数回実行する必要があります。

内側のforループで毎回vベクトルの代わりにおそらく1つの行列を使用して最適化する方法があると確信していますが、それを見つけることができませんでした。オンラインで検索したところ、役立つかもしれないarrayfun関数が見つかりましたが、使用方法がわかりませんでした。

助けてくれてありがとう、グルス

4

1 に答える 1

2

この場合に実行できる最善の最適化はnorm、個々の要素をループするのではなく、自分自身を実装して行列の乗算を利用することです。

ベクトル値の場合、ユークリッド距離である をnorm(v)計算することを思い出してください。norm(v, 2)

norm(v, 2) = (sum (abs (v) .^ 2)) ^ (1/2)

最小距離を見つけるだけでよいので、実際には平方根を取る必要はありません。コンパクトにするためa = x(i, :)に、 、b = y(j, :)M = length(x)および としN = length(y)ます。変数vには差のベクトルが含まれているため、計算を次のように拡張できますdistvect

distvect   = norm(v)
           = norm(x(i, :) - y(j, :))
           = norm(a - b)
           = (sum (abs( a - b ) .^ 2)) ^ (1/2)
distvect^2 = sum (abs ( a - b ) .^ 2)

ここで、関数を冗長(a - b)^2 = a^2 - 2ab + b^2にする二次項 を展開します。abs

distvect^2 = sum (sum(a.*a) * ones(1,N) - 2*a*b' + ones(M,1) * sum(b'.*b') )

最後の最適化は、関数を複数の値に適用することです。xこれは、行列の外積を使用してbyy行列を作成することによって行われます。次に、各列に沿って最小距離を取り、結果の平方根を合計しますlength(x)length(y)

xx   = sum(x .* x, 2) * ones(1, length(y))
xy   = x * y'
yy   = ones(length(x), 1) * sum(y' .* y')

dist = sum(sqrt(min(xx - 2.*xy + yy)))
于 2013-05-20T19:52:50.943 に答える