Jak wyszukać ciąg w tablicy komórek w MATLAB?

103

Powiedzmy, że mam tablicę komórek

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

Co mam zrobić, jeśli chcę znaleźć indeks 'KU'?

Benzoes
źródło
7
Zwróć uwagę, że obecna najpopularniejsza odpowiedź jest dość nieaktualna. Koniecznie sprawdź również tę odpowiedź .
Dennis Jaheruddin

Odpowiedzi:

128

Myślę, że poniższy kod może załatwić sprawę:

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

To wraca

ans = 
     2
Vidar
źródło
11
Pamiętaj, że to ogólne rozwiązanie jest dobre, ponieważ działa dla wielu typów danych, ale działa tylko w przypadku dokładnych dopasowań. Jeśli potrzebujesz dopasowania bez rozróżniania wielkości liter, zobacz stackoverflow.com/a/9433112/44737 . Jeśli chcesz dopasować coś bardziej złożonego, takiego jak wyrażenie regularne lub pole w strukturze, zobacz stackoverflow.com/a/8061808/44737
rob.
ismember jest trochę bardziej niezgrabny i może zostać zaktualizowany o nowsze wersje. Czuję się bezpieczniej dzięki funkcjom opartym na str, takich jak strcmpi itp.
Maddy
1
Pracuje też w Octave
Nino van Hooff,
90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

Upłynęło 0,001976 sekund.

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

Upłynęło 0,000014 sekund.

WIĘC, wyraźnie strcmp('KU', strs)zajmuje znacznie mniej czasu niżismember(strs,'KU')

Pankaj Gupta
źródło
5
Wspaniały! Twoje rozwiązanie powinno być najlepsze!
Antonvh
1
Tak, zgadzam się, to najlepsze rozwiązanie, ale to tylko porównanie rozwiązań andreys i vidars. Więc właściwie andrey powinien to dostać.
Leo
1
Właściwie należy zauważyć, że ta metoda nie działa, jeśli porównujesz dwie tablice o różnej wielkości (tj. Jeśli zamiast 'KU' po lewej stronie masz tablicę ciągów). Rozwiązanie Vidara działa w tym przypadku (całkiem ładnie), więc jest bardziej ogólne.
Nate
@pankaj: Jak to się ma do tworzenia mapy ciągów-> indeksów, a następnie pobierania indeksu przez przeszukiwanie mapy? Pytanie o perfekcję.
faizan
39

Od 2011a zalecanym sposobem jest:

booleanIndex = strcmp('KU', strs)

Jeśli chcesz uzyskać indeks całkowity (którego często nie potrzebujesz), możesz użyć:

integerIndex = find(booleanIndex);

strfind jest przestarzały, więc staraj się go nie używać.

Andrey Rubshtein
źródło
23

Widzę, że wszyscy przegapili najważniejszy błąd w Twoim kodzie:

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

Powinien być:

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

lub

strs = {'HAKUNA' 'MATATA'}

Teraz, jeśli będziesz używać

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

Nie będziesz miał zmartwień :).

Lakoniczny
źródło
Miałem właśnie zmienić oryginalne pytanie, ale widziałem zbyt wiele odpowiedzi :)
raggot
13

Inne odpowiedzi są prawdopodobnie prostsze w tym przypadku, ale dla kompletności pomyślałem, że dodam użycie cellfun z anonimową funkcją

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

co ma tę zaletę, że można łatwo uczynić ją niewrażliwą na wielkość liter lub użyć jej w przypadkach, gdy masz tablicę komórek struktur:

indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))
Robince
źródło
6

Najkrótszy kod:

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

Ale zwraca tylko pierwszą pozycję w strs. Jeśli element nie został znaleziony, to ind=0.

Maxim Suslov
źródło
5

Funkcje strcmp i strcmpi to najbardziej bezpośredni sposób na zrobienie tego. Przeszukują tablice.

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))
Andrew Janke
źródło
-2

Próbowałeś

indices = Find(strs, 'KU')

zobacz link

alternatywnie,

indices = strfind(strs, 'KU');

powinien również działać, jeśli się nie mylę.

Tomek
źródło
Próbowałem znaleźć, ale ponieważ tablica jest tablicą komórek, więc MATLAB zwraca mi pewne błędy ... Ale funkcja strfind wydaje się działać, dzięki!
Benjamin,