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