Come cercare una stringa nell’array di celle in MATLAB?

Diciamo che ho l’array di celle

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

Cosa devo fare se voglio trovare l’indice di 'KU' ?

Credo che il seguente codice potrebbe fare il trucco:

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

Questo ritorna

 ans = 2 
 >> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}; >> tic; ind=find(ismember(strs,'KU')); toc 

Il tempo trascorso è 0.001976 secondi.

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

Il tempo trascorso è 0.000014 secondi.

SO, chiaramente strcmp('KU', strs) richiede molto meno tempo di ismember(strs,'KU')

Dal 2011a, il modo consigliato è:

 booleanIndex = strcmp('KU', strs) 

Se si desidera ottenere l’indice intero (che spesso non è necessario), è ansible utilizzare:

 integerIndex = find(booleanIndex); 

strfind è deprecato, quindi prova a non usarlo.

Vedo che tutti hanno perso il difetto più importante nel codice:

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

dovrebbe essere:

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

o

 strs = {'HAKUNA' 'MATATA'} 

Ora se ti limiti ad usare

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

Non avrai preoccupazioni :).

Altre risposte sono probabilmente più semplici per questo caso, ma per completezza ho pensato di aggiungere l’uso di cellfun con una funzione anonima

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

che ha il vantaggio che è ansible renderlo facilmente insensibile alle maiuscole o usarlo nei casi in cui si dispone di una matrice cellulare di strutture:

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

Le funzioni strcmp e strcmpi sono il modo più diretto per farlo. Cercano attraverso gli array.

 strs = {'HA' 'KU' 'LA' 'MA' 'TATA'} ix = find(strcmp(strs, 'KU')) 

Il codice più breve:

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

Ma restituisce solo la prima posizione in strs . Se elemento non trovato, ind=0 .

hai provato

 indices = Find(strs, 'KU') 

vedi link

in alternativa,

 indices = strfind(strs, 'KU'); 

dovrebbe funzionare anche se non sbaglio.