Поиск и фильтрация элементов в массиве ячеек MATLAB

У меня есть список (массив ячеек) элементов структуры такой:

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

теперь я хотел бы фильтровать mylist для всех структур, из которых s.text = = 'Pickaboo' или другая предопределенная строка. Каков наилучший способ достичь этого в MATLAB? Очевидно, что это легко для массивов, но каков наилучший способ сделать это для ячеек?

3 ответов


можно использовать CELLFUN для этого.

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

однако, почему вы делаете клеточных структур? Если все ваши структуры имеют одинаковые поля, вы можете создать массив структур. Чтобы получить хиты, вы бы использовали ARRAYFUN.


если все ваши структуры в массив ячеек имеют одинаковые поля ('x', 'y' и 's'), то вы можете магазине mylist как массив структуры вместо массива ячеек. Вы можете конвертировать mylist вот так:

mylist = [mylist{:}];

теперь, если все ваши поля 's' также содержат структуры с одинаковыми полями в них, вы можете собрать их все вместе таким же образом, а затем проверить свое поле 'text' используя чего strcmp:

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

здесь isMatch будет будь вектор логического индекса такой же длины, как mylist С, где найдено совпадение и нули в противном случае.


использовать 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