Convert nested text cell array

1 visualizzazione (ultimi 30 giorni)
Dora Schuller
Dora Schuller il 14 Ott 2021
Commentato: Dora Schuller il 19 Ott 2021
Hi,
I have a nested text cell array of different lengths. I would like to make a table from them.
myarray = {{{'a'}}
{{'b'} {'c'}}}
myarray =
2×1 cell array
{1×1 cell}
{1×2 cell}
maxlen = max(cellfun(@numel, myarray));
newcellarray = cellfun(@(s) [s, repmat({''}, 1, maxlen - numel(s))], myarray, 'UniformOutput', false);
I got this:
newcellarray =
1×2 cell array
{1×2 cell} {1×2 cell}
When I do array2table:
array2table(newcellarray)
ans =
2×1 table
newcellarray
____________
{1×2 cell}
{1×2 cell}
But I would like to get something like:
var1 var2
'a' ''
'b' 'c'
Alternatively, if every row of the cell array would be converted to a python-list like structure, it would be even better:
['a', '']
['b', 'c']
Even better if every list would be different size:
['a']
['b', 'c']
  2 Commenti
Stephen23
Stephen23 il 16 Ott 2021
Modificato: Stephen23 il 16 Ott 2021
"if every row of the cell array would be converted to a python-list like structure,"
A python list is basically the same as a MATLAB cell array (i.e. mutable container class), so it is not clear how what you are requsting would be any different from what you show.
MATLAB does not have a "list" type, your examples use the concatenation operator to concatenate character arrays.
Dora Schuller
Dora Schuller il 19 Ott 2021
I see, thanks for the answer. I just wanted to convert it to a human readable format, which displays what is exactly inside the cells. But the answer below worked.

Accedi per commentare.

Risposta accettata

DGM
DGM il 15 Ott 2021
I'm sure there's a simpler way, but idk.
This will convert to a table. Note that the table columns are cell vectors. This is the normal behavior of cell2table, and is necessary as the alternative would be a char column vector with empty elements -- something which can't exist, as arrays can't have holes in them.
myarray = {{{'a'}}
{{'b'} {'c'}}};
maxlen = max(cellfun(@numel, myarray));
newcellarray = cellfun(@(s) [s, repmat({{''}}, 1, maxlen - numel(s))], myarray, 'UniformOutput', false);
% if the inner cells are scalar:
newcellarray = vertcat(newcellarray{:});
newcellarray = cellfun(@(x) horzcat(x{:}),newcellarray,'uniform',false); % get rid of inner cells
T = cell2table(newcellarray)
T = 2×2 table
newcellarray1 newcellarray2 _____________ _____________ {'a'} {0×0 char} {'b'} {'c' }
I don't know anything about python, but I don't know why it wouldn't suffice to just get rid of the redundant nesting of the original cell array.
% alternative?
newcellarray2 = cellfun(@(x) horzcat(x{:}),myarray,'uniform',false); % get rid of inner cells

Più risposte (0)

Prodotti


Release

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by