Изменить массив ячеек с разными размерами столбцов в матрицу

Мне нужно преобразовать массив ячеек T1 = [1x5], где каждая ячейка представляет собой массив ячеек [5x1] чисел в матрицу чисел S1 = [m-by-n]. Проблема заключается в том, что исходный массив ячеек T1 может иметь разное количество строк в каждой ячейке, что означает, что у меня нет массива квадратной формы для использования функции «cell2mat».

Пример:

T1=[1x5] cell array
T1{1}   T1{2}   T1{3}   T1{4}   T1{5}
 1       2       3       4       5
 6       7       8       9      10
11      12      13      14      15
16      17      18      19      20
21      22      23      24

Мне нужно добавить все столбцы вместе:

T2=
 1   2   3   4   5
 6   7   8   9  10
11  12  13  14  15
16  17  18  19  20
21  22  23  24

Затем преобразуйте массив в массив [m-by-n] (всегда квадратной формы), в этом примере S1=[3x8]:

S1=
 1  2  3  4  5  6  7  8
 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24

Я подумал, что, возможно, я мог бы преобразовать T1 в массив [x-by-1], а затем преобразовать этот массив в S1=[m-by-n]. Но что я должен сделать, чтобы получить такие результаты:

T3=
1
2
3
4
...
24

И не нравится

T3=
1
6
11
16
21
2
...
24

Любая помощь будет оценена по достоинству.


person A.Laan    schedule 07.12.2017    source источник
comment
Пожалуйста, добавьте код, который вы разработали до сих пор.   -  person Irreducible    schedule 07.12.2017
comment
Вам нужно придумать более конкретные критерии формы, чем прямоугольные. Почему 3 x 8, а не 4 x 6 или 2 x 12?   -  person excaza    schedule 07.12.2017
comment
Вы пробовали просто транспонировать T1? Когда вы создаете массив, он всегда идет по первому измерению, поэтому транспонирование должно дать вам результат, который вы ищете.   -  person Richard    schedule 07.12.2017


Ответы (1)


Одной из стратегий может быть:

  1. Дополните все элементы массива ячеек символом NaN, чтобы сделать их одинакового размера.
  2. Объедините дополненные массивы
  3. Удалите NaNs
  4. Изменить форму

Это выглядело бы так...

% 1. Get maximum size of T elements
%    Pad all elements of T up to maxn values with NaN
maxn = max(cellfun( @numel, T ));
Tpadded = cellfun( @(x) [x; NaN(maxn-numel(x))], T, 'uni', 0);
% 2. Convert to array.
Tpadded = cat( 2, Tpadded{:} );
% 3. Reshape to be one row and remove NaNs
Trow = reshape( Tpadded.', 1, [] );
Trow = Trow(~isnan(Trow));
% 4. Reshape to desired result
Tout = reshape( Trow, 8, 3 ).';

Результат

Tout = [1   2  3  4  5  6  7  8
        9  10 11 12 13 14 15 16
        17 18 19 20 21 22 23 24]
person Wolfie    schedule 07.12.2017
comment
Спасибо за помощь. Это сработало как шарм. Я изучал заполнение с помощью NAN, но пропустил шаги 2 и 3. - person A.Laan; 08.12.2017