2016-03-26 13 views
0

Ich habe mehrere Zahlen in einem Array und ich möchte den Unterschied zwischen jedem finden und nach dem niedrigsten Ergebnis sortieren (Ich möchte keine Elemente wiederholen). Ich habe versucht, den Befehl „perms“ verwendet, da sie alle Permutationen bekommtDen Unterschied der Permutationen der Zahlen finden und durch das Ergebnis sortieren

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

aber es scheint nicht die Art und Weise zu arbeiten, ich möchte. Hat jemand irgendwelche andere Vorschläge

Beispiel: Ich habe 3 Zahlen a = [120124130] (bitte beachten Sie, dass Hunderte von Zahlen sein könnte), und es würde die Unterschiede zwischen den Zahlen, dann sortiert nach dem Ergebnis finden. Die Berechnungen würden wie folgt aussehen.

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

Also das letzte Array b wie das Array aussehen wird unter

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

PS: Ich verwende Oktave 3.8.1, die wie Matlab ist

+0

, so dass Sie wollen finden, die Unterschiede zwischen allen Paaren von Zahlen in ein bis @Amro Vektor. Was genau willst du dann mit dem Ergebnis machen? Speichern Sie die einzigartigen Unterschiede sortiert? Dieser letzte Teil ist nicht klar. Was ist die erwartete Leistung hier? Das klingt ähnlich wie die PDIST-Funktion. – Amro

+0

Ja, ich habe hinzugefügt, wie das letzte Array in der Frage aussehen würde. –

Antwort

0

Wir verwenden die PDIST Funktion berechnen Sie paarweise Abstände und verwenden dann eine Kombination von ndgrid und tril, um Indizes in die ursprünglichen Werte des Vektors zu bekommen. Schließlich sortieren wir die Verwendung nach Entfernungen:

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

Das sieht gut aus, aber was ist, wenn ich keinen Zugriff auf die PDIST-Funktion habe? –

+0

Die Funktion befindet sich in der Statistik-Toolbox (sowohl MATLAB als auch Octave). Wie auch immer, es ist nicht schwer zu implementieren, Sie berechnen nur die Distanz/Differenz zwischen jedem Zahlenpaar. Gestern habe ich eine Antwort geschrieben, die verschiedene Implementierungen von PDIST2 zeigt (die PDIST sehr ähnlich ist, 'squareform (pdist2 (v, v))' ist wie 'pdist (v)', da PDIST nur die untere Hälfte der ansonsten symmetrischen Matrix zurückgibt): http://StackOverflow.com/a/36225650/97160 – Amro

+0

Danke Ich wollte nicht die ganze Statistik Toolbox laden –

0

Für diejenigen, die nicht die Statistiken Toolbox Dank geht laden

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