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


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

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


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


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ń :).


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

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.


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

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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.