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.