1

私の行列datamatはXY座標を持っています:

-80.26 40.11
-80.44 40.24
-80.29 40.49
-80.45 40.48
-80.55 40.90
-80.32 40.19

すべてのペアの距離を計算する必要があります。その数は6*5/2=15です。距離は単純にsqrt((x_i-x_j)^ 2 +(y_i-y_j)^ 2)です。これらの15の距離値を格納するベクトルを作成するにはどうすればよいですか?ありがとう。

4

1 に答える 1

1

ここに2つの可能な解決策があります。最初のループは単一のループを使用しますが、その構成内ではかなり効率的です。2つ目はループレスですが、追加のマトリックスを割り当てる必要がありAます。両方で時限実行を実行しましたが(以下を参照)、ループのないソリューションが最適です。

%# Your matrix
M = [-80.26 40.11;
     -80.44 40.24;
     -80.29 40.49;
     -80.45 40.48;
     -80.55 40.90;
     -80.32 40.19];

%# Get the indices of all combinations
I1 = combnk(1:size(M, 1), 2);
T = size(I1, 1);

%# Loop-based solution
Soln1 = nan(T, 1);
for n = 1:T
    Soln1(n) = sqrt((M(I1(n, 1), 1) - M(I1(n, 2), 1))^2 + (M(I1(n, 1), 2) - M(I1(n, 2), 2))^2);
end 

%# Loop-less but requires the creation of matrix A
A = M(I1', :);
A = A(2:2:end, :) - A(1:2:end, :);
Soln2 = sqrt(sum(A.^2, 2));

100行のランダム行列の場合、M各ソリューションに対して1000回の反復を実行しました。結果は次のとおりです。

Elapsed time is 0.440229 seconds. %# Loop based solution
Elapsed time is 0.168733 seconds. %# Loop-less solution

ループのないソリューションが勝者のようです。

于 2013-01-30T23:47:27.090 に答える