2010-08-11 17 views
9

Ho una lista (array di celle) di elementi con le strutture del genere:Trovare e filtraggio elementi di un array di celle MATLAB

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

Ora vorrei filtrare mylist per tutte le strutture da cui s.text = = 'Pickaboo' o un'altra stringa predefinita. Qual è il modo migliore per ottenere questo risultato in MATLAB? Ovviamente questo è facile per gli array, ma qual è il modo migliore per farlo per le cellule?

risposta

12

Per questo è possibile utilizzare CELLFUN.

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

Tuttavia, perché si crea una cella di strutture? Se le tue strutture hanno tutti gli stessi campi, puoi creare una serie di strutture. Per ottenere i risultati, devi utilizzare ARRAYFUN.

2

Utilizzare 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

Se tutte le strutture nel vostro array di celle hanno gli stessi campi ('x', 'y', e 's') quindi è possibile memorizzare mylist come un array struttura invece di un array di celle. È possibile convertire mylist in questo modo:

mylist = [mylist{:}]; 

Ora, se tutti i vostri campi 's' contengono anche strutture con gli stessi campi in loro, è possibile raccogliere tutti insieme nello stesso modo, quindi controllare il vostro campo 'text' utilizzando STRCMP:

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

Qui, isMatch sarà un logical index vector la stessa lunghezza mylist con quelli in cui viene trovata una corrispondenza e zeri altrimenti.

Problemi correlati