Comment rechercher une chaîne dans un tableau de cellules dans MATLAB?


103

Disons que j'ai le tableau de cellules

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

Que dois-je faire si je veux trouver l'index de 'KU'?


7
Notez que la principale réponse actuelle est assez obsolète. Assurez-vous de vérifier également cette réponse .
Dennis Jaheruddin

Réponses:


128

Je suppose que le code suivant pourrait faire l'affaire:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ind=find(ismember(strs,'KU'))

Cela renvoie

ans = 
     2

11
Gardez à l'esprit que cette solution générique est bonne car elle fonctionne pour plusieurs types de données, mais elle ne fonctionne que pour les correspondances exactes. Si vous avez besoin d'une correspondance insensible à la casse, consultez stackoverflow.com/a/9433112/44737 . Si vous avez besoin de faire correspondre quelque chose de plus complexe comme une expression régulière ou un champ dans une structure, voir stackoverflow.com/a/8061808/44737
rob

ismember est un peu plus maladroit et peut être mis à jour avec des versions plus récentes. Je me sens plus en sécurité avec les fonctions basées sur str comme strcmpi, etc.
Maddy

1
Fonctionne aussi dans Octave
Nino van Hooff

90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

Le temps écoulé est de 0,001976 secondes.

>> tic; find(strcmp('KU', strs)); toc

Le temps écoulé est de 0,000014 seconde.

SO, strcmp('KU', strs)prend clairement beaucoup moins de temps queismember(strs,'KU')


5
Génial! Votre solution devrait être la meilleure!
Antonvh

1
Oui, je suis d'accord, c'est la meilleure solution, mais c'est juste une comparaison entre les solutions andreys et vidars. Donc, en fait, Andrey devrait l'obtenir.
Leo

1
En fait, il faut souligner que cette méthode ne fonctionne pas si vous comparez deux tableaux de taille différente (c'est-à-dire si au lieu de «KU» sur le côté gauche, vous avez un tableau de chaînes). La solution de Vidar fonctionne dans ce cas (assez bien), elle est donc plus générale.
Nate

@pankaj: Comment cela se compare-t-il à la création d'une carte de chaînes-> indices et à l'obtention d'un index en faisant une recherche sur la carte? Demander perf sage.
faizan

39

Depuis 2011a, la méthode recommandée est:

booleanIndex = strcmp('KU', strs)

Si vous souhaitez obtenir l'index entier (dont vous n'avez souvent pas besoin), vous pouvez utiliser:

integerIndex = find(booleanIndex);

strfind est obsolète, alors essayez de ne pas l'utiliser.


23

Je vois que tout le monde a manqué la faille la plus importante de votre code:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

devrait être:

strs = {'HA' 'KU' 'NA' 'MA' 'TATA'} 

ou

strs = {'HAKUNA' 'MATATA'}

Maintenant, si vous vous en tenez à utiliser

ind=find(ismember(strs,'KU'))

Vous n'aurez aucun souci :).


J'étais sur le point de modifier la question d'origine mais j'ai vu trop de réponses :)
raggot

13

D'autres réponses sont probablement plus simples pour ce cas, mais pour être complet, j'ai pensé ajouter l'utilisation de cellfun avec une fonction anonyme

indices = find(cellfun(@(x) strcmp(x,'KU'), strs))

ce qui a l'avantage de pouvoir facilement le rendre insensible à la casse ou de l'utiliser dans les cas où vous avez un tableau de cellules de structures:

indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))

6

Code le plus court:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
[~,ind]=ismember('KU', strs)

Mais il ne renvoie que la première position dans strs. Si l'élément n'est pas trouvé, alors ind=0.


5

Les fonctions strcmp et strcmpi sont le moyen le plus direct de le faire. Ils recherchent dans les tableaux.

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))

-2

as-tu essayé

indices = Find(strs, 'KU')

voir le lien

alternativement,

indices = strfind(strs, 'KU');

devrait également fonctionner si je ne me trompe pas.


J'ai essayé de trouver mais comme le tableau est un tableau de cellules, MATLAB me renvoie des erreurs ... Mais la fonction strfind semble fonctionner, merci!
Benjamin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.