¿Cómo buscar una cadena en una matriz de celdas en MATLAB?

103

Digamos que tengo la matriz de celdas

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

¿Qué debo hacer si quiero encontrar el índice de 'KU'?

Benjamín
fuente
7
Tenga en cuenta que la respuesta principal actual está bastante desactualizada. Asegúrese de verificar también esta respuesta .
Dennis Jaheruddin

Respuestas:

128

Supongo que el siguiente código podría hacer el truco:

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

Esto vuelve

ans = 
     2
Vidar
fuente
11
Tenga en cuenta que esta solución genérica es buena porque funciona para múltiples tipos de datos, pero solo funciona para coincidencias exactas. Si necesita una coincidencia que no distinga entre mayúsculas y minúsculas, consulte stackoverflow.com/a/9433112/44737 . Si necesita hacer coincidir algo más complejo como una expresión regular o un campo en una estructura, consulte stackoverflow.com/a/8061808/44737
rob
ismember es un poco más torpe y puede actualizarse con versiones más nuevas. Me siento más seguro con funciones más str base como strcmpi, etc.
Maddy
1
También funciona en Octave
Nino van Hooff
90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

El tiempo transcurrido es 0.001976 segundos.

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

El tiempo transcurrido es de 0,000014 segundos.

Entonces, claramente strcmp('KU', strs)toma mucho menos tiempo queismember(strs,'KU')

Pankaj Gupta
fuente
5
¡Excelente! ¡Tu solución debe ser la mejor!
Antonvh
1
Sí, estoy de acuerdo, esta es la mejor solución, sin embargo, es solo una comparación entre las soluciones de andreys y vidars. Entonces, en realidad, Andrei debería conseguirlo.
Leo
1
En realidad, debe señalarse que este método no funciona si está comparando dos matrices de diferente tamaño (es decir, si en lugar de 'KU' en el lado izquierdo, tiene una matriz de cadenas). La solución de Vidar funciona en ese caso (bastante bien), por lo que es más general.
Nate
@pankaj: ¿Cómo se compara esto con hacer un mapa de cadenas-> índices y luego obtener un índice haciendo una búsqueda de mapa? Preguntando a la perfección.
faizan
39

Desde 2011a, la forma recomendada es:

booleanIndex = strcmp('KU', strs)

Si desea obtener el índice de enteros (que a menudo no necesita), puede usar:

integerIndex = find(booleanIndex);

strfind está en desuso, así que trate de no usarlo.

Andrey Rubshtein
fuente
23

Veo que todos pasaron por alto la falla más importante en su código:

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

debiera ser:

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

o

strs = {'HAKUNA' 'MATATA'}

Ahora bien, si sigues usando

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

No tendrás preocupaciones :).

Brusco
fuente
Estaba a punto de editar la pregunta original pero vi demasiadas respuestas :)
raggot
13

Otras respuestas probablemente sean más simples para este caso, pero para completar, pensé que agregaría el uso de cellfun con una función anónima

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

lo cual tiene la ventaja de que puede hacer que no distinga entre mayúsculas y minúsculas o usarlo en los casos en que tenga una matriz de estructuras de celdas:

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

Código más corto:

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

Pero solo devuelve la primera posición en strs. Si no se encuentra el elemento, entonces ind=0.

Maxim Suslov
fuente
5

Las funciones strcmp y strcmpi son la forma más directa de hacer esto. Buscan a través de matrices.

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

has probado

indices = Find(strs, 'KU')

ver enlace

alternativamente,

indices = strfind(strs, 'KU');

también debería funcionar si no me equivoco.

Tom
fuente
Intenté buscar, pero como la matriz es una matriz de celdas, MATLAB me devuelve algunos errores ... Pero la función strfind parece funcionar, ¡gracias!
Benjamin