Как объединить массивы ячеек, которые являются частью массива ячеек в MATLAB? - PullRequest
7 голосов
/ 17 мая 2011

У меня есть массив ячеек allData, который равен Nx1. Каждая ячейка содержит структуру со свойством names (имя является пользовательским объектом, но, если хотите, вы можете рассматривать его как массив строк). Я хотел бы создать один массив ячеек, который содержит все имена. Например, если 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 ]

4 голосов
/ 17 мая 2011

Есть еще несколько подробностей о содержимом вашей ячейки, которые понадобятся для более общего решения, но если свойство names всегда возвращает массив ячеек строк, и если все ваши структуры являются скалярами (т.е. 1-by-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'

РЕДАКТИРОВАТЬ:

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

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

Или, если вы предпочитаете в конечном итоге 1-По количеству ячеек массива объектов вы можете сделать это:

allNames = cellfun(@(x) {reshape(x.names,1,[])},allData);
allNames = [allNames{:}];
1 голос
/ 17 мая 2011

Попробуйте это

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...