Como procurar por uma string na matriz de células no MATLAB?

103

Digamos que eu tenha a matriz de células

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

O que devo fazer se quiser encontrar o índice de 'KU'?

Benjamin
fonte
7
Observe que a principal resposta atual está bastante desatualizada. Certifique-se de também verificar esta resposta .
Dennis Jaheruddin

Respostas:

128

Acho que o código a seguir pode resolver o problema:

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

Isso retorna

ans = 
     2
Vidar
fonte
11
Lembre-se de que essa solução genérica é boa porque funciona para vários tipos de dados, mas só funciona para correspondências exatas. Se você precisar de uma correspondência que não diferencia maiúsculas de minúsculas, consulte stackoverflow.com/a/9433112/44737 . Se você precisar corresponder a algo mais complexo, como um regex ou um campo em uma estrutura, consulte stackoverflow.com/a/8061808/44737
rob
ismember é um pouco mais desajeitado e pode ser atualizado com versões mais recentes. Sinto-me mais seguro com funções baseadas em str, como strcmpi, etc.
Maddy
1
Também funciona no Octave
Nino van Hooff
90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

O tempo decorrido é 0,001976 segundos.

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

O tempo decorrido é 0,000014 segundos.

ASSIM, claramente strcmp('KU', strs)leva muito menos tempo do queismember(strs,'KU')

Pankaj Gupta
fonte
5
Ótimo! Sua solução deve ser a melhor!
Antonvh
1
Sim, concordo, esta é a melhor solução, porém é apenas uma comparação entre as soluções andreys e vidars. Então, na verdade, o andrey deveria entender.
Leo,
1
Na verdade, deve ser apontado que este método não funciona se você estiver comparando dois arrays de tamanhos diferentes (ou seja, se em vez de 'KU' no lado esquerdo, você tiver um array de strings). A solução de Vidar funciona nesse caso (muito bem), então é mais geral.
Nate
@pankaj: Como isso se compara a fazer um Mapa de String-> Índices e então obter o índice fazendo uma pesquisa no mapa? Pedir desempenho.
faizan 01 de
39

Desde 2011a, a forma recomendada é:

booleanIndex = strcmp('KU', strs)

Se você quiser obter o índice inteiro (que geralmente não precisa), pode usar:

integerIndex = find(booleanIndex);

strfind está obsoleto, então tente não usá-lo.

Andrey Rubshtein
fonte
23

Vejo que todos não perceberam a falha mais importante em seu código:

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

deveria estar:

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

ou

strs = {'HAKUNA' 'MATATA'}

Agora, se você continuar usando

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

Você não terá que se preocupar :).

Curt
fonte
Eu estava prestes a editar a pergunta original, mas vi muitas respostas :)
raggot
13

Outras respostas são provavelmente mais simples para este caso, mas para completar, pensei em adicionar o uso de cellfun com uma função anônima

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

que tem a vantagem de que você pode facilmente torná-lo insensível a maiúsculas e minúsculas ou usá-lo nos casos em que você tem uma matriz de células de estruturas:

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

Código mais curto:

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

Mas ele retorna apenas a primeira posição em strs. Se o elemento não for encontrado, então ind=0.

Maxim Suslov
fonte
5

As funções strcmp e strcmpi são a maneira mais direta de fazer isso. Eles procuram por matrizes.

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))
Andrew Janke
fonte
-2

você tentou

indices = Find(strs, 'KU')

veja o link

alternativamente,

indices = strfind(strs, 'KU');

também deve funcionar se não me engano.

Tom
fonte
Eu tentei encontrar, mas como a matriz é uma matriz de células, o MATLAB me retorna alguns erros ... Mas a função strfind parece funcionar, obrigado!
Benjamin