2015-07-22 2 views
10

Ich habe einen großen Vektor, der monoton steigende Daten oder ein Duplikat, sucht so etwas wie dies enthält:Wie Elemente in einem Array extrahiert werden, die mehrere Einträge enthalten?

data = [0 1.1 2.2 3.3 4.4 4.4 4.4 4.4 5.5 6.6 6.6 6.6 7.7]; 

In diesem Datensatz, ich bin interessiert an den Duplikat Einträge (in diesem Fall 4.4 und 6.6). Ich habe eine sorta klobig Lösung, um diese Werte zu extrahieren, aber ich fühle mich wie MATLAB eine Einzeiler Lösung um ein Ergebnis zu extrahieren wie

result = [4.4 6.6]; 

Antwort

13

Die Kombination von unique und diff reicht, find ist eigentlich nicht nötig.

out = unique(data(~diff(data))) 
4

Mein Motto haben sollte:

unique(data(find(diff(data)==0))) 

Testen Sie here!


Erläuterung:

  1. mit diff erhalten Sie die Unterschiede von einem Element zum nächsten.

  2. wie das Array zuvor bestellt wird, das Ergebnis der obigen Linie Ausgang Null auf den wiederholt denjenigen.

  3. Mit find(result_from_above == 0) ich, wo sie leben (Indizes für Nullen)

  4. Mit data(result_from_above) ich die wiederholten Elemente, und dann gelten einzigartig, sie zu erhalten.

Update:

Sie logische Indizierung verwenden können, wie @rayryeng sagte, müssen Sie nicht die find benötigen, dann wird es:

unique(data(diff(data)==0)); 

es dann here testen

+0

Mit 'find' unnötig ist.Logische Indizierung ist gut genug: 'unique (Daten (diff (Daten) == 0))' – rayryeng

+0

Nizza. Wenn Sie nun das '== 0' entfernen und durch' ~ diff (data) 'ersetzen, hätten Sie in seiner Antwort das, was thewaywewalk hat. – rayryeng

+0

@rayryeng. In diesem Fall bevorzuge ich das == 0, weil es für den Leser klarer ist. Ich würde auch vorschlagen, nicht alles in eine Zeile zu schreiben, wie ich es bei der Antwort getan habe, weil es dadurch weniger lesbar ist. –

3

Sie können Folgendes tun.

[~,index]=unique(data); 
unique(data(setdiff(1:length(data),index))) 

der index werden die Indizes für die eindeutige Werte haben, die setdiff werden diejenigen Index aus dem 1:length(data) Vektor, der die nicht-eindeutigen Index-Werte sind zu entfernen. Dann werden diese mit dem Vektor data indiziert und wieder wird einmalig verwendet, um zu erhalten, wie Sie benötigen.

6

Hier ist eine andere Option nur hist und Indizierung:

result = data(hist(data, data) > 1); 
Verwandte Themen