Convert nested text cell array

2 ビュー (過去 30 日間)
Dora Schuller
Dora Schuller 2021 年 10 月 14 日
コメント済み: Dora Schuller 2021 年 10 月 19 日
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 件のコメント
Stephen23
Stephen23 2021 年 10 月 16 日
編集済み: Stephen23 2021 年 10 月 16 日
"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 2021 年 10 月 19 日
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.

サインインしてコメントする。

採用された回答

DGM
DGM 2021 年 10 月 15 日
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
  1 件のコメント
Dora Schuller
Dora Schuller 2021 年 10 月 19 日
Thank you, this worked!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by