Преобразование ячейки в структуру в matlab

#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)'}          ...
);