如何解除嵌套的单元格数组?
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,:}
是的,不要一个接一个地打电话。
您好,我正在尝试创建一个看起来像这样的元胞数组。
'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,:}
是的,不要一个接一个地打电话。