Unnest cell array with nested cells to a cell array

조회 수: 56 (최근 30일)
Federico Canè
Federico Canè 2014년 10월 20일
댓글: Simon Matte 2020년 10월 12일
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

채택된 답변

Sean de Wolski
Sean de Wolski 2014년 10월 20일
% 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
Boris
Boris 2017년 7월 29일
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 2017년 7월 29일
편집: Boris 2017년 7월 29일
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...

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Gabor Bekes
Gabor Bekes 2019년 11월 11일
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
Simon Matte
Simon Matte 2020년 10월 12일
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

댓글을 달려면 로그인하십시오.


Federico Canè
Federico Canè 2014년 10월 20일
wow, exactly what I needed. Thx

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by