У меня есть список (массив ячеек) элементов с такими структурами:
mystruct = struct('x', 'foo', 'y', 'bar', 's', struct('text', 'Pickabo'));
mylist = {mystruct <more similar struct elements here>};
Теперь я хотел бы отфильтровать mylist для всех структур, из которых .text == 'Pickaboo' или другая предопределенная строка. Каков наилучший способ добиться этого в MATLAB? Очевидно, это легко для массивов, но как лучше всего это сделать для ячеек?
Для этого можно использовать CELLFUN .
hits = cellfun(@(x)strcmp(x.s.text,'Pickabo'),mylist);
filteredList = mylist(hits);
Но почему вы делаете ячейку из структур? Если все ваши структуры имеют одинаковые поля, вы можете создать массив структур. Для получения обращений используйте ARRAYFUN .
Если все ваши структуры в массиве ячеек имеют одинаковые поля ( 'x'
, 'y'
и 's '
), то вы можете сохранить mylist
как массив структур вместо массива ячеек. Вы можете преобразовать mylist
следующим образом:
mylist = [mylist{:}];
Теперь, если все ваши поля 's'
также содержат структуры с одинаковыми полями, вы можете собрать их все вместе в одном затем проверьте свое поле 'текст'
, используя 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