2012-02-24 10 views
5

Estoy tratando de encontrar las ubicaciones donde se produce una subcadena en una matriz de células en MATLAB. El siguiente código funciona, pero es bastante feo. Me parece que debería haber una solución más fácil.MATLAB matriz de búsqueda para el subconjunto de cadenas

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

Esto es similar a, pero no es el mismo que this y this.

Respuesta

7

Lo que hay que hacer es encapsular esta idea como una función. Ya sea en línea:

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

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

O contenida en dos archivos-m:

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

y

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

Así que ahora usted puede simplemente escribir

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

Salud! Eso funciona, pero la cosa es que esperaba que hubiera una función incorporada para esto, o al menos una forma de hacerlo en menos pasos. Si a alguien se le ocurre algo genial, si no marcaré esto como una solución en unas pocas horas. – dgmp88

+0

Por lo que sé, no hay una función incorporada. Tuve el mismo problema hace un tiempo, y terminé escribiendo estos fragmentos de código porque no pude encontrar un built-in que hiciera lo que quería. –

+0

Lo suficientemente justo. Iré con esto entonces - ¡salud! – dgmp88

4

no lo hago saber si lo considerarías como simpler solución que la tuya, pero regular expressions son una muy buena utilidad de uso general que a menudo uso para buscar cadenas. Una forma de extraer las células de cellArray que contiene palabras con 'words' en ellos es el siguiente:

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

matches = 

    'nicewords' 'morewords' 
+0

Excelente solución, pero estoy aterrado de las expresiones regulares. Son menos líneas de código, pero he marcado el anterior como correcto, prefiero evitar la expresión regular. Lo siento, eso se siente un poco injusto ya que esto es correcto y, en cierto sentido, más simple. – dgmp88

+0

@ dgmp88: Lo entiendo completamente. Las expresiones regulares tardan un poco en acostumbrarse, pero una vez que las dominas te sientes como un superhéroe (http://xkcd.com/208/). ;) – gnovice

Cuestiones relacionadas