Reshape array of cells with different column sizes into matrix
4 views (last 30 days)
Show older comments
Hi. I need to reshape a T1 = [1x5] cell array, where each cell is a [5x1] cell array of numbers into a S1 = [m-by-n] matrix of numbers. The problem is the initial cell array T1 may have different number of rows in each cell - meaning I don't have a square shaped array to use " cell2mat " function.
Example:
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
I need to add all of the columns together:
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
And then reshape the array into [m-by-n] array (always square shaped), in this example 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
I thought that maybe I could reshape T1 into [x-by-1] array and then reshape that array in to S1=[m-by-n]. But what should i do in order to get results like this:
T3=
1
2
3
4
...
24
And not like
1
6
11
16
21
2
...
24
Any help would be appreciated.
1 Comment
Stephen23
on 7 Dec 2017
@Ardo Laaneots: is the shorter vector always the last one in the cell array?
Accepted Answer
Jos (10584)
on 7 Dec 2017
Here is a way:
T = {[1:5:21]',[2:5:22]',[3:5:23]',[4:5:24]',[5:5:20]'}
m=3
n=8
[M, tf] = padcat(T{:})
M = M.'
out = reshape(M(tf.'),n,m).' % swap m and n, and then transpose
PADCAT concatenates unequal sized vectors by padding shorter ones with NaNs. This function can be downloaded from the File Exchange: https://uk.mathworks.com/matlabcentral/fileexchange/22909-padcat-varargin-
0 Comments
More Answers (1)
KL
on 7 Dec 2017
One approach is to make all elements equal in size by padding 0s or nans and then use cell2mat,
m = max(cellfun(@numel,T1));
for k = 1:numel(T1)
n = numel(T1{k});
if n<m
T1{k} = [T1{k}; nan(m-n,1)];
end
end
T2 = cell2mat(T1)'
0 Comments
See Also
Categories
Find more on Cell Arrays in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!