Как объединить массивы ячеек, которые являются частью массива ячеек в MATLAB?

у меня есть массив ячеек allData что NX1 по. Каждая ячейка содержит структуру с names property (имя является настраиваемым объектом, но думайте об этом как о массиве ячеек строк, если хотите). Я хотел бы создать единый массив ячеек, содержащий все имена. Например, если N=3, так что allData является массивом ячеек 3x1, то следующее достигло бы моей цели:

A = allData{1};
B = allData{2};
C = allData{3};

allNames = [A.names B.names C.names];

проблема с этим подходом заключается в том, что N велико и изменяется в зависимости от входного сигнала, так Я надеюсь, что есть хитрый способ сделать это с помощью cellfun, но все, что я пробовал, терпит неудачу (например, это не работает, чтобы сделать allNames = [cellfun(@(x) {x.names}, allData)];).

обновление: благодаря предложенным решениям я могу получить все в один массив ячеек, где каждая ячейка содержит массив ячеек. Моя цель здесь-объединить их. Более или менее, то, что у меня есть:

{A.names B.names C.names} 

и то, что я хочу, и не могу показаться, чтобы получить это

{A.names{1} A.names{2} ... A.names{end} B.names{1} ... B.names{end} ...}

решение: Я необходимые фрагменты каждого ответа ниже, поэтому вот решение, которое сработало для меня:

С Андрей Лазарь:

allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);

затем с gnovice:

allNames = vertcat(allNames{:});

спасибо!!

2 ответов


есть еще несколько деталей о содержимом вашей ячейки, которые были бы необходимы для более общего решения, но если names свойство всегда возвращает массив ячеек строк, и если ваши структуры все скаляры (т. е. массивы структур 1 на 1), то следующее решение с использованием CELLFUN, CHAR и CELLSTR даст вам массив ячеек N-by-1 строк allNames содержащий все ваши имена:

allNames = cellfun(@(x) {char(x.names)},allData);
allNames = cellstr(char(allNames{:}));

и вот пример, где allData содержит три различные структуры:

>> allData{1} = struct('names',{{'hello'}},'junk',1:3);
>> allData{2} = struct('names',{{'hi' 'yo' 'hey' 'whassup'}});
>> allData{3} = struct('names',{{'howdy';'aloha'}},'junk',4);
>> allNames = cellfun(@(x) {char(x.names)},allData);
>> allNames = cellstr(char(allNames{:}))

allNames = 

    'hello'
    'hi'
    'yo'
    'hey'
    'whassup'
    'howdy'
    'aloha'

EDIT:

обобщение на случай, когда names свойство возвращает массив ячеек объекты не обязательно строки, вы можете попробовать это решение, которое перекраивает каждый массив ячеек в массив ячеек M-by-1, затем вертикально связывает все они в массив ячеек N-by-1 объектов:

allNames = cellfun(@(x) {reshape(x.names,[],1)},allData);
allNames = vertcat(allNames{:});

или, если вы скорее всего, вы получите массив объектов размером 1 на N ячеек, вы можете сделать следующее:

allNames = cellfun(@(x) {reshape(x.names,1,[])},allData);
allNames = [allNames{:}];

попробуй такое

 allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false)

опустите UniformOutput vararg для прямой конкатенации. Это дает выход ячейки.