Home Reshape array of cells with different column sizes into matrix
Reply: 1

Reshape array of cells with different column sizes into matrix

A.Laan
1#
A.Laan Published in 2017-12-07 14:52:06Z

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

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

Any help would be appreciated.

Wolfie
2#
Wolfie Reply to 2017-12-07 16:00:08Z

One strategy would be:

  1. Pad all of the cell array elements with NaN to make them the same size
  2. Concatenate the padded arrays
  3. Remove the NaNs
  4. Reshape

That would look like this...

% 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 ).';

Result

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]
You need to login account before you can post.

About| Privacy statement| Terms of Service| Advertising| Contact us| Help| Sitemap|
Processed in 0.354701 second(s) , Gzip On .

© 2016 Powered by mzan.com design MATCHINFO