Unnest cell array with nested cells to a cell array

How do I expand out an array with dimension '<100x1 cell>' in which each cell has a dimension '<1x11 cell>' into an array with dimension '<100x11 cell>'. Surely this must be straightforward? Thx

 Akzeptierte Antwort

Sean de Wolski
Sean de Wolski am 20 Okt. 2014
% Sample Data
C = repmat({num2cell(1:11,1)},100,1);
% Unpacked
C2 = vertcat(C{:})
Unpack ( {:} ) it and use comma-separated list expansion in vertcat.

3 Kommentare

SUSHMA MB
SUSHMA MB am 28 Feb. 2017
But what if the dimensions are different. How do I expand out an array with dimension '<82794x1 cell>' in which each cell has different dimension like;
[1x12] double [1x18] double [1x6] double [1x14] double [1x6] double [1x10] double [1x6] double [1x8] double.....and so
Boris
Boris am 29 Jul. 2017
Doesn't appear to work if the cell array contains cell arrays of empties ([]). Gives a single 1 column vertical cell array with most (but crucially not all) the elements......
Im my case, mycellarray has 1 x 26 cell array. Each of these cell arra6 has 709 by 1 cells. Several of these cell arrays are empty, some are partially empty. vertcat --> a cell array with 17018 x 1 cells, each with a single entry (many blank). However, 26*709 is 18434, not 17018...
Furthermore, if I transpose mycellarray (26 x 1 cells) then vertcat, I get the same result (17018 x 1 cells)... Must be hitting some kind of limit, I guess. Pity, as it is a pain to concatenate each cell array in mycellarray in a loop (or similar)...
Boris
Boris am 29 Jul. 2017
Bearbeitet: Boris am 29 Jul. 2017
Of course, it helps if you check that all the entries in the cell array are all cell arrays!
I had two cell array entries that were themselves arrays of doubles, not cell arrays and this is what was throwing the concatenation.
However, the very simple (horizontal) concatenation given by:
myflatcellarray=[mycellarray{:}];
seems to be marginally faster than horzcat...

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Gabor Bekes
Gabor Bekes am 11 Nov. 2019
You might want something along the lines of:
a2 = {{'asdf',{'asdf','asdf',{'asdf'},{'asdf'},{'asdf',{'asdf'}},'asdf'},{'asdf',{'asdf'},{{'asdf'}}}},'asdf'}
while any(cellfun(@iscell,a2))
a2 = [a2{cellfun(@iscell,a2)} a2(~cellfun(@iscell,a2))];
end
Now, you need to know in advance if you have a row, column or matrix layout cell array, and you need to use vertcat() for the latter two cases (logical indexing produces columns).

1 Kommentar

Stumbled on this by googling a similar situation, wanted to add:
The previous solution works, but it also re-orders the elements in your cell array. Since it mattered in my specific case, I used this variant for my application:
while any(cellfun(@iscell, a2))
idx = cellfun(@iscell, a2);
a2(idx) = a2{idx};
a2(~idx) = a2(~idx);
end

Melden Sie sich an, um zu kommentieren.

Kategorien

Community Treasure Hunt

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

Start Hunting!

Translated by