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


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

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


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.


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


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

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.


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

-2

você tentou

indices = Find(strs, 'KU')

veja o link

alternativamente,

indices = strfind(strs, 'KU');

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.