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

6 vues (au cours des 30 derniers jours)
Bjoern
Bjoern le 17 Juin 2014
Commenté : Bjoern le 19 Juin 2014
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)

Réponse acceptée

Andrei Bobrov
Andrei Bobrov le 18 Juin 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 commentaires
Azzi Abdelmalek
Azzi Abdelmalek le 18 Juin 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 le 19 Juin 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 :)

Connectez-vous pour commenter.

Plus de réponses (2)

Cedric
Cedric le 17 Juin 2014
To = cellfun( @(cc)num2cell(cc), Fr, 'UniformOutput', false ) ;
To = [To{:}] ;
  6 commentaires
Cedric
Cedric le 18 Juin 2014
See Andrei's answer, NUM2CELL can take a second "dim" argument and I didn't know that!
Bjoern
Bjoern le 19 Juin 2014
Alright, thanks!!

Connectez-vous pour commenter.


Azzi Abdelmalek
Azzi Abdelmalek le 17 Juin 2014
Modifié(e) : Azzi Abdelmalek le 17 Juin 2014
To=num2cell([Fr{:}])
  4 commentaires
Bjoern
Bjoern le 17 Juin 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 le 18 Juin 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)

Connectez-vous pour commenter.

Catégories

En savoir plus sur Cell Arrays dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by