2010-08-11 16 views
9

ich eine Liste (Zellenfeld) von Elementen mit structs wie diese:Suchen und Filterelemente in einem MATLAB Zellenfeld

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

Nun möchte Ich mag mylist für alle structs filtern, aus denen s.text = = 'Pickaboo' oder eine andere vordefinierte Zeichenfolge. Was ist der beste Weg, dies in MATLAB zu erreichen? Offensichtlich ist dies für Arrays einfach, aber was ist der beste Weg, dies für Zellen zu tun?

Antwort

12

Sie können dafür CELLFUN verwenden.

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

Warum jedoch machen Sie eine Zelle von Strukturen? Wenn Ihre Strukturen alle die gleichen Felder haben, können Sie ein Array von Strukturen erstellen. Um die Treffer zu erhalten, verwenden Sie dann ARRAYFUN.

2

Verwenden Sie 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

Wenn alle Ihre Strukturen in der Zelle Array haben die gleichen Felder ('x', 'y' und 's'), dann können Sie mylist als Struktur-Array speichern, anstatt eines Zellenfeldes. Sie können mylist wie so konvertieren:

mylist = [mylist{:}]; 

Nun, wenn alle Felder 's' auch Strukturen mit den gleichen Feldern in ihnen enthalten, können Sie sie alle zusammen in der gleichen Art und Weise sammeln können, dann überprüfen Sie Ihr Feld 'text' mit STRCMP:

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

Hier isMatch wird eine logical index vector die gleiche Länge wie mylist mit denen sein, wo eine Übereinstimmung sonst und Nullen zu finden ist.

Verwandte Themen