2016-03-26 6 views
0

私は配列にいくつかの数字がありますが、それぞれの数字の間に差があり、最低の結果で並べ替えたいのですが(項目を繰り返したくない)。私はすべての順列を得るので、コマンド "perms"を使って試しました。数字の順列の違いを見つけて結果でソートする

v = [120;124;130]; 
p = perms(v) 

しかし、それは私のようにはうまくいかないようです。誰もが他の提案が

例持っています: を私は3つの数字を持っている= [120124130](数字の数百がある可能性がありますのでご注意ください)、それは、その後、ソート結果によって、数字の違いを見つけるだろう。計算は以下のテキストのようになります。

124-120 =4 
130-124 =6 
130-120 =10 

ので、最終的な配列bが

b= 
    [124 120 4 
    130 124 6 
    130 120 10] 

PS以下の配列のようになります。私はMathWorks社のMATLABのようなものですオクターブ3.8.1を使用してい

+0

を@Amroに行きますベクター。それでは、結果と正確に何をしたいですか?ユニークな違いを並べ替えて保存しますか?最後の部分は明確ではありません。ここに期待される成果は?これはPDIST関数に似て聞こえる。 – Amro

+0

はい私は最終的な配列が質問のように見えるものを追加しました。 –

答えて

0

我々はにPDIST機能を使用することができます対の距離を計算し、ndgridtrilの組み合わせを使用して、ベクトルの元の値にインデックスを取得します。最後に、我々は、ソートの距離に応じて使用して:統計ツールボックスのおかげを読み込むことができないものについては

v = [120;124;130]; 
D = pdist(v, 'cityblock'); 
[a,b] = ndgrid(1:numel(v), 1:numel(v)); 
out = sortrows([v(nonzeros(tril(a,-1))) v(nonzeros(tril(b,-1))) D(:)], 3) 
+0

それは素晴らしいですが、もし私がpdist関数にアクセスできないのであれば? –

+0

この関数は統計ツールボックス(MATLABとOctaveの両方)にあります。とにかく実装するのは難しいことではありませんが、数値の各ペア間の距離/差を計算するだけです。ちょうど昨日、私はPDIST2の別の実装を示す答えを投稿しました(これはPDISTに非常に似ていますが、 'squareform(pdist2(v、v))'はPDISTがそうでなければ対称行列の下半分を返すので 'pdist ):http://stackoverflow.com/a/36225650/97160 – Amro

+0

統計情報ツールボックス全体をロードしたくありませんでした。 –

0

はそうあなたが数字のすべてのペア間の相違を見つけたい

v = [120;124.6;130]; 
%taken out from pdist.m from statistics package 
order = nchoosek(1:rows(v),2); 
Xi = order(:,1); 
Yi = order(:,2); 
X = v'; 
d = X(:,Xi) - X(:,Yi); 
y = norm (d, "cols"); 

[a,b] = ndgrid(1:numel(v), 1:numel(v)); 
out = sortrows([v(nonzeros(tril(a,-1))) v(nonzeros(tril(b,-1))) y(:)], 3) 

out= 
    124.6000 120.0000  4.6000 
     130.0000 124.6000  5.4000 
     130.0000 120.0000 10.0000 
関連する問題