Convert nested text cell array
    3 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
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}
Using the suggestion here: https://nl.mathworks.com/matlabcentral/answers/499119-making-cell-array-of-cells-of-strings-the-same-size-by-adding-empty-strings:
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 commentaires
  Stephen23
      
      
 le 16 Oct 2021
				
      Modifié(e) : Stephen23
      
      
 le 16 Oct 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.
Réponse acceptée
  DGM
      
      
 le 15 Oct 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)
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
Plus de réponses (0)
Voir également
Catégories
				En savoir plus sur Logical dans Help Center et File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


