2010-06-17 22 views
24

Je possède ce réseau de cellules dans Matlab:Comment puis-je supprimer les doublons dans un tableau mais conserver le même ordre?

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

J'utilise unique(y) pour se débarrasser des doublons mais il réorganise les chaînes dans l'ordre alphabétique:

>> unique(y) 

ans = 

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

Je veux supprimer les doublons, mais garder le même ordre. Je sais que je pourrais écrire une fonction faire cela mais je me demandais s'il y avait un moyen plus simple d'utiliser unique pour supprimer les doublons tout en gardant le même ordre juste avec les doublons supprimés.

Je veux qu'il revienne ceci:

>> unique(y) 

ans = 

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

Je suppose que la réponse donnée par Amro est le meilleur moyen d'y parvenir maintenant. 'unique (y, 'stable')' –

Répondre

27

est ici une solution qui utilise des arguments d'entrée et de sortie supplémentaires UNIQUE a:

>> 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

Maintenant, pourquoi n'ai-je pas pensé à le faire de cette façon? +1 – Doresoom

+0

+1: J'ai déjà une fonction dans mon chemin appelée 'uniq.m' qui fait cela exactement, je l'utilise tout le temps :) – Amro

6

Si vous regardez la documentation unique, il y a la possibilité de retourner un index avec le tableau trié. Vous pouvez spécifier si vous souhaitez également que la première ou la dernière occurrence d'un nombre soit renvoyée à l'index.

Par exemple:

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

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

retours

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

Vous pouvez trier votre tableau de commande et stocker l'index suivant

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

et enfin réindexer b

b=b(index) 
+0

+1: On dirait que nous avons révisé nos réponses en même temps. – gnovice

21

En Matlab R2012a, une nouvelle order flag a été ajouté:

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