Преобразование структуры / массива массивов в один массив в Matlab

У меня есть структура Matlab, которая содержит массивы. В частности, это выделяется так:

info(27).field1 = [];
info(27).field2 = [];
info(27).field3 = [];

Заполнено через цикл

% here simplified for your convenience
for i = 1:27
    info(i).field1 = rand(1,4);
    info(i).field2 = rand(1,4);
    info(i).field3 = rand(1,4);

И когда заполнено (с моими значениями) выглядит так:

[1048576;0;0;0] [1;0;0;0]   [1;0;0;0]
[1047512;0;1064;0]  [0,99;0;0,01;0] [1;0;8;0]
[1047900;0;676;0]   [0,94;0;0,07;0] [2;0;3;0]
...

Я хочу, чтобы это была одна (27x12) таблица, которую я могу сохранить как файл таблицы с отдельными значениями массивов, являющихся столбцами (используя writetable(T,'myData.csv', ...')Примерно так (заголовки таблиц можно пренебречь):

1.A     1.B 1.C     1.D     2.A     2.B 2.C 2.D     3.A 3.B 3.C 3.D
___     ___ ___     ___     ___     ___ ___ ___     ___ ___ ___ ___
1048576 0   0       0       1,00    0   0       0   1   0   0   0
1047512 0   1064    0       0,99    0   0,01    0   1   0   8   0
1047900 0   676     0       0,94    0   0,07    0   2   0   3   0

Или даже лучше

1.A     1.B 1.C     1.D     2.A     2.B 2.C 2.D     3.A 3.B 3.C 3.D
___     ___ ___     ___     ___     ___ ___ ___     ___ ___ ___ ___
1048576 0   0       0       100%    0%  0%  0%      1   0   0   0
1047512 0   1064    0       99%     0%  1%  0%      1   0   8   0
1047900 0   676     0       94%     0%  7%  0%      2   0   3   0

Что я пробовал до сих пор:

T = table(info)    %obviously doesn't work

 info     
_____________

[1x27 struct]

И обходной путь с массивом ячеек

% create a cell array and try to concatenate the arrays in the array
C = struct2cell(info)
Cp = permute(C,[3 1 2]);
Cpx = horzcat(Cp(:,1),Cp(:,2),Cp(:,3));
T = table(Cpx)

T = 

                  Cpx                   
________________________________________

[4x1 double]  [4x1 double]  [4x1 double]
[4x1 double]  [4x1 double]  [4x1 double]
[4x1 double]  [4x1 double]  [4x1 double]
...

Я думал, что horzcat сработает, но почему-то не могу понять, почему это не так. Кто-нибудь с решением для этого?

1 ответ

Решение

Ваш звонок в horzcat просто объединяет три столбца Cp (как клеточные массивы). Они уже являются столбцами, поэтому выходные данные совпадают с входными данными.

Если вы хотите объединить содержимое вместе, вы можете сначала преобразовать в матрицу, используя cell2mat а затем передать это непосредственно array2table создать table,

T = array2table(cell2mat(Cp));

Обновить

Если ваши оригинальные векторы 4x1 вместо этого вы можете сделать следующее:

T = array2table(squeeze(cell2mat(struct2cell(info))).')
Другие вопросы по тегам