2010-08-11 23 views
9

tengo una lista (matriz de células) de elementos con estructuras como esto:elementos Encontrar y filtrado en una matriz de células MATLAB

mystruct = struct('x', 'foo', 'y', 'bar', 's', struct('text', 'Pickabo')); 
mylist = {mystruct <more similar struct elements here>}; 

Ahora me gustaría filtrar mylist para todas las estructuras de la que s.text = = 'Pickaboo' o alguna otra cadena predefinida. ¿Cuál es la mejor manera de lograr esto en MATLAB? Obviamente, esto es fácil para las matrices, pero ¿cuál es la mejor manera de hacer esto para las células?

Respuesta

12

Puede usar CELLFUN para esto.

hits = cellfun(@(x)strcmp(x.s.text,'Pickabo'),mylist); 
filteredList = mylist(hits); 

Sin embargo, ¿por qué haces una celda de estructuras? Si todas tus estructuras tienen los mismos campos, puedes hacer una serie de estructuras. Para obtener los hits, entonces usaría ARRAYFUN.

2

Use cellfun.

mystruct = struct('x', 'foo', 'y', 'bar', 's', struct('text', 'Pickabo')); 
mystruct1 = struct('x', 'foo1', 'y', 'bar1', 's', struct('text', 'Pickabo')); 
mystruct2 = struct('x', 'foo2', 'y', 'bar2', 's', struct('text', 'Pickabo1')); 

mylist = {mystruct, mystruct1, mystruct2 }; 

string_of_interest = 'Pickabo'; %# define your string of interest here 
mylist_index_of_interest = cellfun(@(x) strcmp(x.s.text,string_of_interest), mylist); %# find the indices of the struct of interest 
mylist_of_interest = mylist(mylist_index_of_interest); %# create a new list containing only the the structs of interest 
4

Si todas las estructuras de la matriz de células tienen los mismos campos ('x', 'y' y 's') entonces se puede almacenar mylist como una matriz de estructura en lugar de una matriz de células. Puede convertir mylist así:

mylist = [mylist{:}]; 

Ahora, si todos sus campos 's' también contienen estructuras con los mismos campos en ellos, se puede recoger a todos juntos en la misma forma, a continuación, comprobar su campo 'text' usando STRCMP:

s = [mylist.s]; 
isMatch = strcmp({s.text},'Pickabo'); 

Aquí, isMatch habrá un logical index vector la misma longitud que mylist con aquellos en los que se encuentra una coincidencia y ceros de otra manera.

Cuestiones relacionadas