2012-02-24 13 views
5

Sto cercando di trovare le posizioni in cui si verifica una sottostringa in un array di celle in MATLAB. Il codice sotto funziona, ma è piuttosto brutto. Mi sembra che dovrebbe esserci una soluzione più semplice.MATLAB array di celle di ricerca per sottoinsieme di stringhe

cellArray = [{'these'} 'are' 'some' 'nicewords' 'and' 'some' 'morewords']; 
wordPlaces = cellfun(@length,strfind(cellArray,'words')); 
wordPlaces = find(wordPlaces); % Word places is the locations. 
cellArray(wordPlaces); 

Questo è simile, ma non la stessa this e this.

risposta

7

La cosa da fare è incapsulare questa idea come una funzione. Sia in linea:

substrmatch = @(x,y) ~cellfun(@isempty,strfind(y,x)) 

findmatching = @(x,y) y(substrmatch(x,y)) 

o contenute in due m-files:

function idx = substrmatch(word,cellarray) 
    idx = ~cellfun(@isempty,strfind(word,cellarray)) 

e

function newcell = findmatching(word,oldcell) 
    newcell = oldcell(substrmatch(word,oldcell)) 

Così ora si può semplicemente digitare

>> findmatching('words',cellArray) 
ans = 
    'nicewords' 'morewords' 
+0

Cheers! Funziona, ma la cosa è che speravo che ci sarebbe stato in funzione per questo, o almeno un modo per farlo in meno passi. Se qualcuno esce con qualcosa di grande, se non lo segnerò come soluzione in poche ore. – dgmp88

+0

Per quanto ne so non esiste una funzione integrata. Ho avuto lo stesso problema un po 'di tempo fa e ho finito per scrivere questi frammenti di codice perché non riuscivo a trovare un built-in che facesse ciò che volevo. –

+0

Abbastanza giusto. Vado con questo allora - evviva! – dgmp88

4

non lo faccio sai se lo considereresti un più semplice della tua soluzione, ma regular expressions sono un'ottima utilità generale che utilizzo spesso per cercare stringhe. Un modo per estrarre le cellule dal cellArray che contiene le parole con 'words' in loro è la seguente:

>> matches = regexp(cellArray,'^.*words.*$','match'); %# Extract the matches 
>> matches = [matches{:}]        %# Remove empty cells 

matches = 

    'nicewords' 'morewords' 
+0

Ottima soluzione, ma sono terrorizzato dalle espressioni regolari. Sono meno righe di codice, ma ho contrassegnato quanto sopra corretto in quanto preferisco evitare espressioni regolari. Mi spiace, mi sembra un po 'ingiusto perché è corretto e in un certo senso più semplice. – dgmp88

+0

@ dgmp88: Capisco completamente. Le espressioni regolari richiedono un po 'di tempo per abituarsi, ma una volta capito da loro [ti senti come un supereroe] (http://xkcd.com/208/). ;) – gnovice

Problemi correlati