Как объединить массивы ячеек, которые являются частью массива ячеек в 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 для прямой конкатенации. Это дает выход ячейки.