2016-06-26 16 views
0

Ich habe einen Vektor z.B. A = [2.30 2.32 2.67 2.44 2.31 1.23] Ich bin daran interessiert, alle nächsten (fast gleichen) Werte in diesem Vektor zu finden. Die Antwort von oben Beispiel sollte Index 1,2 und 5 sein.Wie finden Sie alle nächsten Werte innerhalb eines Vektors in MATLAB?

Ich weiß nicht, wie man die Toleranz vorschreibt, aber die resultierenden Werte sollten fast gleich sein. Kann irgendein Körper einen Hinweis geben?

Antwort

0

Wenn Sie den Abstand mathematisch ausdrücken möchten, können Sie den euklidischen Abstand verwenden. Hier ist der Ausdruck:

enter image description here

Wenn Sie einen höherdimensionalen Raum haben (was Sie haben) Sie einige Informationen von Wikipedia erhalten. Aber es ist immer noch einfach:

https://en.wikipedia.org/wiki/Euclidean_distance#n_dimensions

Da die euklidische Entfernung ist nicht die beste Abstandsmessung in höherdimensionalen Räumen, einige Leute die Kosinusähnlichkeit vorschlagen:

https://en.wikipedia.org/wiki/Cosine_similarity

Sie könnten auch verwenden ein Algorithmus wie k-means oder k-nearest-neighbors, um diese Aufgabe zu lösen.

Wenn Sie in der es für den ähnlichsten Werte suchen gerade:

  • einen Schwellenwert definieren. Sagen wir, 0,01

  • das erste Element des Vektors Wählen (xi, wobei i = 0)

  • das erste Element auswählen, welche nicht xi (xj, wobei j = i + 1) ist

  • Vergleichen Sie xi mit xj zum Beispiel mit dist = sqrt ((xi - xj)^2). Wenn dist kleiner oder gleich Ihrem Schwellenwert ist, sind xi und xj sehr ähnlich
    ähnlich.

  • Increment xj und vergleichen Sie wieder

  • Wenn xj am Ende des Vektors ist, erhöht xi

  • Tun Sie dies, bis Sie alle Elemente verglichen.
1

Ich schlage vor, den folgenden Ansatz:

%initialize A 
A=[2.30 2.32 2.67 2.44 2.31 1.23]; 

%initilize an epsilon parameter which defines how close 2 values should be to one another to considered identical. 
EPSILON = 0.05; 

%generates all possible lists of pairs coordinates from A 
[p,q] = meshgrid(1:n); 
mask = logical(tril(ones(n,n))-eye(n,n)); 
allPairs = [p(mask),q(mask)]; 

%find pairs with absolute difference below epsilon 
validPairs = abs(A(allPairs(:,1))- A(allPairs(:,2))) < EPSILON; 

%result - pairs of numbers which are close to one another 
allPairs(validPairs,:) 

Ergebnis:

ans = 

1  2 
1  5 
2  5 

* Der Code für alle möglichen Paare Erzeugung von @Lambdageek genommen wird solution

+0

Ich konnte die Toleranz (EPSILON) im Voraus nicht erraten? Kann für ein anderes Beispiel anders sein. – erbal

0

Dieser Ansatz funktioniert nicht brauche eine definierte absolute Toleranz, statt eine Toleranz relativ zur kleinsten Differenz ist ne erreicht. Es sucht immer nach der dichtesten Gruppe in den Daten. In diesem Formular wird es nicht funktionieren, wenn Sie genaue doppelte Werte in Ihren Daten haben, , aber Sie können es problemlos erweitern, um auch diesen Fall gut zu behandeln.

A=[2.30 2.32 2.67 2.44 2.31 1.23]; 
diffFactor=3; 

Asorted=sort(A); 
Adiff=abs(Asorted(1:end-1)-Asorted(2:end)); 
[minDiff,minInd]=min(Adiff); 

commonValue=Asorted(minInd); 

resultIndex=find(A>=commonValue-diffFactor*minDiff & A<=commonValue+diffFactor*minDiff) 
+0

Wenn zwei Werte im Datensatz identisch sind, ignoriert dieser Code alle höheren/niedrigeren Werte. Und wie entscheidet man DiffFactor? – erbal

Verwandte Themen