将具有不同列大小的单元阵列重新整形为矩阵

时间:2017-12-07 14:52:07

标签: matlab reshape

我需要重塑一个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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

一种策略是:

  1. 使用NaN填充所有单元格数组元素以使它们具有相同的大小
  2. 连接填充数组
  3. 删除NaN s
  4. 整形
  5. 这看起来像这样......

    % 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]