#matlab #structure #cell
#matlab #структура #ячейка
Вопрос:
Я пытаюсь преобразовать ячейку в структуру:
A = {'p1', 10, 'ny'; 'p2', 12, 'nj'};
Я хотел бы структуру с 3 полями, где
A.person = {'p1';'p2'}
A.age = [10;12]
A.state = {'ny', 'nj'}
Я попробовал cell2struct, но получал формат, который мне не нужен.
Я знаю, что мне не хватает чего-то простого. Есть мысли?
Комментарии:
1. Вы имеете в виду, что действительно важно иметь
person
поле в виде массива ячеек столбца, в то время какstate
поле должно быть массивом ячеек строки?2. Вам следует изменить свой вопрос, чтобы он соответствовал выбранному вами ответу. 🙂
Ответ №1:
Что не так с cell2struct
? Пусть
>> fields = {'person','age','state'}; %// field names
Вы могли бы использовать любую из следующих трех версий:
>> S = cell2struct(A, fields, 2); %// fold 2nd dim into fields
S =
2x1 struct array with fields:
person
age
state
(дает структурный массив размером 2×1).
>> S = cell2struct(mat2cell(A.', ones(1,size(A,2))), fields, 1)
S =
person: {'p1' 'p2'}
age: {[10] [12]}
state: {'ny' 'nj'}
(выдает массив структуры размером 1×1, с массивом ячеек строк в каждом поле).
>> S = cell2struct(mat2cell(A, size(A,1), ones(1,size(A,2))), fields, 2)
S =
person: {2x1 cell}
age: {2x1 cell}
state: {2x1 cell}
>> S.person
ans =
'p1'
'p2'
(выдает массив структуры размером 1×1, с массивом ячеек столбца в каждом поле)
Комментарии:
1. Спасибо за быстрый ответ. Я зашел так далеко, но это не совсем то, что я ищу. Это дает мне структуру с двумя структурами, спрятанными внутри. Я просто хочу, чтобы одна родительская структура показывала три поля. таким образом, что если я запрашиваю S.aa, я получаю vector [10; 12] вместо ans = 10, ans = 12
2. @KeithD Второе решение дает в значительной степени то, что вы показываете. Не так уж сложно опубликовать ее, если требуется. Например, вот так:
S.age = vertcat(S.age{:})
3. Извините, задержка по времени и нажатие возврата опубликованного комментария, когда я действительно хотел перейти к новой строке. В любом случае, второе предложение — это то, что я ищу. Спасибо.
Ответ №2:
Учитывая тот факт, что результат должен иметь разную арность в зависимости от поля, одним из способов было бы начать с этого:
A = {'p1', 10, 'ny'; 'p2', 12, 'nj'};
и продолжая с этим:
A = struct( ...
'person', {A(:,1)}, ...
'age', cell2mat(A(:,2)), ...
'state', {A(:,3)'} ...
);