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

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

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

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


person smichak    schedule 11.08.2010    source источник


Ответы (3)


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

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

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

person Jonas    schedule 11.08.2010

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

mylist = [mylist{:}];

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

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

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

person gnovice    schedule 11.08.2010

Используйте 1_.

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
person YYC    schedule 11.08.2010