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


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

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


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.


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


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

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.


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

-2

has probado

indices = Find(strs, 'KU')

ver enlace

alternativamente,

indices = strfind(strs, 'KU');

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.