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


Risposte:


128

Immagino che il seguente codice possa fare il trucco:

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

Questo ritorna

ans = 
     2

11
Tieni presente che questa soluzione generica è buona perché funziona per più tipi di dati, ma funziona solo per corrispondenze esatte. Se è necessaria una corrispondenza senza distinzione tra maiuscole e minuscole, vedere stackoverflow.com/a/9433112/44737 . Se devi abbinare qualcosa di più complesso come una regex o un campo in una struttura, vedi stackoverflow.com/a/8061808/44737
rob

ismember è un po 'più goffo e può essere aggiornato con le versioni più recenti. Mi sento più sicuro con le funzioni basate su str come strcmpi, ecc.
Maddy

1
Lavora anche in Octave
Nino van Hooff

90
>> 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.

Quindi, chiaramente strcmp('KU', strs)richiede molto meno tempo rispetto aismember(strs,'KU')


5
Grande! La tua soluzione dovrebbe essere la migliore!
Antonvh

1
Sì, sono d'accordo, questa è la soluzione migliore, tuttavia è solo un confronto tra le soluzioni andreys e vidars. Quindi in realtà andrey dovrebbe capirlo.
Leone

1
In realtà, va sottolineato che questo metodo non funziona se stai confrontando due array di dimensioni diverse (cioè se invece di 'KU' sul lato sinistro, hai un array di stringhe). La soluzione di Vidar funziona in questo caso (abbastanza bene), quindi è più generale.
Nate

@pankaj: come si confronta con la creazione di una mappa di stringhe-> indici e quindi con l'indice facendo una ricerca sulla mappa? Chiedere saggio perfetto.
faizan

39

Dal 2011a, il modo consigliato è:

booleanIndex = strcmp('KU', strs)

Se vuoi ottenere l'indice intero (che spesso non ti serve), puoi usare:

integerIndex = find(booleanIndex);

strfind è deprecato, quindi cerca di non usarlo.


23

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

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

dovrebbe essere:

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

o

strs = {'HAKUNA' 'MATATA'}

Ora, se continui a usare

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

Non avrai preoccupazioni :).


Stavo per modificare la domanda originale ma ho visto troppe risposte :)
raggot

13

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 puoi facilmente renderlo insensibile alle maiuscole o usarlo nei casi in cui hai un array di celle di strutture:

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

6

Codice più breve:

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

Ma ritorna solo in prima posizione strs. Se l'elemento non viene trovato, allora ind=0.


5

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

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

-2

hai provato

indices = Find(strs, 'KU')

vedi link

in alternativa,

indices = strfind(strs, 'KU');

dovrebbe funzionare anche se non sbaglio.


Ho provato a trovare ma poiché l'array è un array di celle, MATLAB mi restituisce alcuni errori ... Ma la funzione strfind sembra funzionare, grazie!
Benjamin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.