Convert cell-array to array-of-cells, for array-of-struct creation?
Show older comments
Hi, how can I convert a cell-array to an array-of-cells?
I have (following a file textscan) a cell array of format:
Fr = [{uint8([1;2;3])}, {uint32([4;5;6])}, {[7;8;9]}]
And need to get to this array of cells:
To = [{Fr{1,1}(1), Fr{1,2}(1), Fr{1,3}(1)} ;...
{Fr{1,1}(2), Fr{1,2}(2), Fr{1,3}(2)} ;...
{Fr{1,1}(3), Fr{1,2}(3), Fr{1,3}(3)}]
..without having to loop (Fr can be large) through Fr.
The reason is that I want an array-of-struct, rather than struct-of-array. Reference:
Incorrect = cell2struct(Fr,{'f1','f2','f3'},2)
Correct = cell2struct(To,{'f1','f2','f3'},2)
Accepted Answer
More Answers (2)
Cedric
on 17 Jun 2014
To = cellfun( @(cc)num2cell(cc), Fr, 'UniformOutput', false ) ;
To = [To{:}] ;
6 Comments
Is it the final structure (2 columns in the last array) or do you have more arrays and columns? Note that my solution treats the last array properly according to your definition of To in the statement (with no internal structure). So what output do you expect/need with this extra array?
>> To
To =
[1] [4] [7] [11] [12]
[2] [5] [8] [13] [14]
[3] [6] [9] [15] [16]
>> for cId = 1 : size( To, 2), disp( class( To{1,cId} )) ; end
uint8
uint32
double
uint8
uint8
Bjoern
on 18 Jun 2014
Then here is a solution
To = cellfun( @(cc) mat2cell( cc, ones( size(cc, 1), 1 )), Fr, ...
'UniformOutput', false ) ;
To = [To{:}] ;
Cedric
on 18 Jun 2014
See Andrei's answer, NUM2CELL can take a second "dim" argument and I didn't know that!
Bjoern
on 19 Jun 2014
Azzi Abdelmalek
on 17 Jun 2014
Edited: Azzi Abdelmalek
on 17 Jun 2014
To=num2cell([Fr{:}])
4 Comments
Bjoern
on 17 Jun 2014
Azzi Abdelmalek
on 17 Jun 2014
Fr = [{uint8([1;2;3])}, {uint32([4;5;6])}, {[7;8;9]}]
n=numel(Fr{1})
m=numel(Fr)
[jj,ii]=meshgrid(1:n,1:m)
out=arrayfun(@(x,y) Fr{x}(y),ii,jj,'un',0)'
Bjoern
on 17 Jun 2014
Azzi Abdelmalek
on 18 Jun 2014
Fr = [{uint8([1;2;3])}, {uint32([4;5;6])},...
{[7;8;9]}, {uint8([11,12;13,14;15,16])}]
mm=cellfun(@(x) size(x,2),Fr)
nn=1:numel(mm)
r=size(Fr{1},1)
dd=cell2mat(arrayfun(@(x,y) [1:x;y*ones(1,x)],mm,nn,'un',0))
[i1,j1]=meshgrid(dd(1,:),1:r)
[i2,j2]=meshgrid(dd(2,:),1:r)
out=arrayfun(@(x,y,z) Fr{x}(y,z),i2,j1,i1,'un',0)
Categories
Find more on Cell Arrays in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!