web-dev-qa-db-fra.com

Comment puis-je supprimer les doublons dans un tableau mais garder le même ordre?

J'ai ce tableau de cellules dans MATLAB:

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 par ordre alphabétique:

>> unique(y)

ans =

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

Je souhaite supprimer les doublons mais garder le même ordre. Je sais que je pourrais écrire une fonction pour ce faire, 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 avec les doublons supprimés.

Je veux qu'il retourne ceci:

>> unique(y)

ans = 

'd'    'f'    'a'    'g'    'w'    'h'
25
Ben Fossen

Voici une solution qui utilise des arguments d'entrée et de sortie supplémentaires qui 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'
28
gnovice

Dans MATLAB R2012a, un nouveau indicateur de commande a été ajouté:

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

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

Par exemple:

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

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

retour

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

Vous pouvez trier votre tableau de commandes 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)
6
Doresoom