如何解除嵌套的单元格数组?

How to unnest a nested cell array?

您好,我正在尝试创建一个看起来像这样的元胞数组。

'3/7/2014'  '209.167.128.156'   1037 
'3/13/2014' '204.205.57.137'    8
'3/18/2014' '209.167.128.156'   164
'3/27/2014' '216.178.43.209'    825

但问题是当我 运行 我的代码得到一个如下所示的元胞数组时

{1x3cell} {1x3 cell} {1x3 cell} {1x3 cell} {1x3 cell]

这是我的代码:

cell = {};
month = 'March';
[num text raw] = xlsread(sheet);
text(1,:)= [];
fanta = text(:,1);
[row col] = size(fanta);
a = 1;
for i = 1:row
    coke = fanta{i};
    [first rest] = strtok(coke, '/');
    if strcmp(first, '1') && strcmp(month, 'January')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '2') && strcmp(month, 'February')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '3') && strcmp(month, 'March')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '4') && strcmp(month, 'April')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '5') && strcmp(month, 'May')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '6') && strcmp(month, 'June')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '7') && strcmp(month, 'July')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '8') && strcmp(month, 'August')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '9') && strcmp(month, 'Sepetember')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '10') && strcmp(month, 'October')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '11') && strcmp(month, 'November')
        cell{i} = raw((a+i), :);
    end
    if strcmp(first, '12') && strcmp(month, 'December')
        cell{i} = raw((a+i), :);
    end
end
cell = cell(~cellfun('isempty', cell))

我做错了什么,我该如何解决。 谢谢。

要折叠元胞数组,您可以尝试

  C = cell2mat(C); % <-- using cell as a var name is bad practice!

试一试,看看是否有效。例如(这是八度,但应该在 matlab 中工作):

C =
{
  [1,1] =
  {
    [1,1] = 3/7/2014
    [1,2] = 209.167.128.156
    [1,3] =  1037
  }
  [2,1] =
  {
    [1,1] = 3/13/2014
    [1,2] = 204.205.57.137
    [1,3] =  8
  }
  [3,1] =
  {
    [1,1] = 3/18/2014
    [1,2] = 209.167.128.156
    [1,3] =  164
  }
  [4,1] =
  {
    [1,1] = 3/27/2014
    [1,2] = 216.178.43.209
    [1,3] =  825
  }
}

cell2mat(C)
ans =
{
  [1,1] = 3/7/2014
  [2,1] = 3/13/2014
  [3,1] = 3/18/2014
  [4,1] = 3/27/2014
  [1,2] = 209.167.128.156
  [2,2] = 204.205.57.137
  [3,2] = 209.167.128.156
  [4,2] = 216.178.43.209
  [1,3] =  1037
  [2,3] =  8
  [3,3] =  164
  [4,3] =  825
}

首先,您应该永远不要调用变量cell,因为它是内置 Matlab 函数的名称。这很糟糕,你应该为此受到惩罚:-)

假设您已将所有 cell 替换为 C。然后,您应该首先定义 C by

C = cell(0,3);

并替换你所有的

C{i} = ...

来自

C(i,:) = ...

最后一点:最后一列将由字符串而非数字组成。如果您确实希望此列中有数字,您可能应该考虑在代码中的某处使用函数 str2double

最佳,

似乎没有任何实际错误发生,如果您使用的是单元格,那么您基本上是在创建一个数组数组。如果您访问 cell{i} 它将 return 一个包含 3 个项目的向量,这些项目是您显示的内容的行。如前所述,您可以使用矩阵,但矩阵不能处理不同的数据类型(在您的情况下是字符串和整数),所以我会继续使用单元格。 此外,您还可以创建多维。

所以,与 Crazy Rat 所说的类似,我会替换

cell{i}

来自

cell{i,:}

是的,不要一个接一个地打电话。