我想计算单元格数组中的所有元素,包括“嵌套”单元格中的元素。
对于单元格数组
>> C = {{{1,2},{3,4,5}},{{{6},{7},{8}},{9}},10}
C = {1x2 cell} {1x2 cell} [10]
答案应为10
。
一种方法是重复使用[C{:}]
,直到没有剩余细胞,然后使用numel
,但必须有更好的方法吗?
答案 0 :(得分:9)
由于您只对元素数感兴趣,因此这是flatten.m的简化版本@Ansari链接到:
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)
基本上我们创建一个不可见的图形,绘制单元格数组,计算创建了多少“文本”对象,然后删除不可见的图形。
这就是情节在下面的样子:
答案 1 :(得分:2)
将它放在一个函数中(比如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))
以查找元素总数。
如果你不喜欢创建一个单独的函数,你可以使用这个聪明(但讨厌的)代码片段来定义使用匿名函数(来自here的代码)的flatten函数:
flatten = @(nested) feval(Y(@(flat) @(v) foldr(@(x, y) ifthenelse(iscell(x) | iscell(y), @() [flat(x), flat(y)], @() {x, y}), [], v)), nested);
无论哪种方式,您都需要递归以展平单元格数组,然后计算。