我想计算单元格数组中的所有元素,包括“嵌套”单元格中的元素。
对于元胞数组
>> C = {{{1,2},{3,4,5}},{{{6},{7},{8}},{9}},10}
C = {1x2 cell} {1x2 cell} [10]
答案应该是10
。
一种方法是[C{:}]
重复使用,直到没有单元格留下,然后使用numel
但必须有更好的方法?
由于您只对元素的数量感兴趣,因此这是@Ansari链接到的flatten.m的简化版本:
function n = my_numel(A)
n = 0;
for i=1:numel(A)
if iscell(A{i})
n = n + my_numel(A{i});
else
n = n + numel(A{i});
end
end
end
结果:
>> C = {{{1,2},{3,4,5}},{{{6},{7},{8}},{9}},10};
>> my_numel(C)
ans =
10
如果您觉得懒惰,我们可以让CELLPLOT进行计数:
hFig = figure('Visible','off');
num = numel( findobj(cellplot(C),'type','text') );
close(hFig)
基本上我们创建一个不可见的图形,绘制单元格数组,计算创建了多少“文本”对象,然后删除不可见的图形。
这是情节在下面的样子:
把它放在一个函数中(比如说flatten.m
)(来自MATLAB Central的代码):
function C = flatten(A)
C = {};
for i=1:numel(A)
if(~iscell(A{i}))
C = [C,A{i}];
else
Ctemp = flatten(A{i});
C = [C,Ctemp{:}];
end
end
然后做numel(flatten(C))
找到元素的总数。
如果你不喜欢创建一个单独的函数,你可以使用这段聪明(但讨厌)的代码来定义一个使用匿名函数的扁平化函数(代码来自这里):
flatten = @(nested) feval(Y(@(flat) @(v) foldr(@(x, y) ifthenelse(iscell(x) | iscell(y), @() [flat(x), flat(y)], @() {x, y}), [], v)), nested);
无论哪种方式,您都需要递归以展平单元阵列然后计数。