Convert cell-array to array-of-cells, for array-of-struct creation?

4 Ansichten (letzte 30 Tage)
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)

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 18 Jun. 2014
Fr = [{uint8([1;2;3])}, {uint32([4;5;6])},...
{[7;8;9]}, {uint8([11,12;13,14;15,16])}];
To = cellfun(@(x)num2cell(x,2),Fr,'un',0);
out = [To{:}];
  6 Kommentare
Azzi Abdelmalek
Azzi Abdelmalek am 18 Jun. 2014
Sorry Andrei, I didn't read completly the explanation given by Bjoern. There is no doubt about your result, I misunderstood the new question.
Bjoern
Bjoern am 19 Jun. 2014
Excellent, thanks a lot! Just FYI for other users:
This proposal is about 60% quicker than Cedric's proposal. Both produced the same result :)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Cedric
Cedric am 17 Jun. 2014
To = cellfun( @(cc)num2cell(cc), Fr, 'UniformOutput', false ) ;
To = [To{:}] ;
  6 Kommentare
Cedric
Cedric am 18 Jun. 2014
See Andrei's answer, NUM2CELL can take a second "dim" argument and I didn't know that!

Melden Sie sich an, um zu kommentieren.


Azzi Abdelmalek
Azzi Abdelmalek am 17 Jun. 2014
Bearbeitet: Azzi Abdelmalek am 17 Jun. 2014
To=num2cell([Fr{:}])
  4 Kommentare
Bjoern
Bjoern am 17 Jun. 2014
Thanks once again! Please see the comment (for Cedric) on me missing to mention an important fact. It looks like your proposal removes the last column.
Azzi Abdelmalek
Azzi Abdelmalek am 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)

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Cell Arrays finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by