Поиск и фильтрация элементов в массиве ячеек MATLAB - PullRequest
9 голосов
/ 11 августа 2010

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

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

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

Ответы [ 3 ]

12 голосов
/ 11 августа 2010

Для этого вы можете использовать CELLFUN .

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

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

4 голосов
/ 12 августа 2010

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

mylist = [mylist{:}];

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

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

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

2 голосов
/ 11 августа 2010

Использование 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
...