将具有不同列大小的单元格数组重塑为矩阵
Reshape array of cells with different column sizes into matrix
我需要将 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
如有任何帮助,我们将不胜感激。
一个策略是:
- 用
NaN
填充所有元胞数组元素,使它们大小相同
- 连接填充数组
- 删除
NaN
s
- 重塑
看起来像这样...
% 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]
我需要将 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
如有任何帮助,我们将不胜感激。
一个策略是:
- 用
NaN
填充所有元胞数组元素,使它们大小相同 - 连接填充数组
- 删除
NaN
s - 重塑
看起来像这样...
% 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]