2010-06-17 7 views
24

Ich habe dieses Zellenfeld in MATLAB:Wie kann ich Duplikate in einem Array entfernen, aber die Reihenfolge beibehalten?

y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'} 

ich unique(y) verwenden loszuwerden, die Duplikaten zu bekommen, aber es ordnet die Saiten in alphabetischer Reihenfolge:

>> unique(y) 

ans = 

'a' 'd' 'f' 'g' 'h' 'w' 

ich die Duplikate entfernen will, aber halten die gleiche Reihenfolge. Ich weiß, dass ich eine Funktion schreiben konnte, tue dies, aber ich fragte mich, ob es einen einfacheren Weg gab, unique zu verwenden, um Duplikate zu entfernen, während die gleiche Reihenfolge nur bei entfernten Duplikaten beibehalten wurde.

Ich will es diese zurück:

>> unique(y) 

ans = 

'd' 'f' 'a' 'g' 'w' 'h' 
+2

Ich nehme an, die Antwort von Amro ist der beste Weg, dies jetzt zu erreichen. 'unique (y, 'stable')' –

Antwort

27

Hier ist eine Lösung, die einige zusätzliche Ein- und Ausgangs Argumente verwendet, dass UNIQUE hat:

>> y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'}; %# Sample data 
>> [~,index] = unique(y,'first');  %# Capture the index, ignore the actual values 
>> y(sort(index))       %# Index y with the sorted index 

ans = 

    'd' 'f' 'a' 'g' 'w' 'h' 
+2

Nun, warum habe ich nicht daran gedacht, es so zu machen? +1 – Doresoom

+0

+1: Ich habe bereits eine Funktion in meinem Pfad namens 'uniq.m', die genau das tut, ich benutze es die ganze Zeit :) – Amro

6

Wenn man sich die Dokumentation sucht unique, besteht die Möglichkeit ist, einen Index zusammen mit dem sortierten Feld zurückzukehren. Sie können angeben, ob das erste oder letzte Vorkommen einer Zahl auch an den Index zurückgegeben werden soll.

Zum Beispiel:

a=[5, 3, 4, 2, 1, 5, 4]; 

[b,order]=unique(a,'first') 

kehrt

b=[1, 2, 3, 4, 5] und m=[5, 4, 2, 3, 1]

Sie können Ihre Bestellung Array und speichern Sie den Index weiter

[~,index]=sort(order) %# use a throw-away variable instead of ~ for older versions 

und schließlich neu indizieren b sortieren

b=b(index) 
+0

+1: Sieht so aus, als hätten wir unsere Antworten gleichzeitig überarbeitet. – gnovice

21

In MATLAB R2012a ein neues order flag hinzugefügt wurde:

>> y = {'d' 'f' 'a' 'g' 'g' 'a' 'w' 'h'}; 
>> unique(y, 'stable') 
ans = 
    'd' 'f' 'a' 'g' 'w' 'h' 
Verwandte Themen