计算单元格数组中所有元素的最佳方法?

时间:2012-07-03 09:48:46

标签: matlab cell

我想计算单元格数组中的所有元素,包括“嵌套”单元格中的元素。

对于单元格数组

>> C = {{{1,2},{3,4,5}},{{{6},{7},{8}},{9}},10}

C = {1x2 cell}    {1x2 cell}    [10]

答案应为10

一种方法是重复使用[C{:}],直到没有剩余细胞,然后使用numel,但必须有更好的方法吗?

2 个答案:

答案 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)

基本上我们创建一个不可见的图形,绘制单元格数组,计算创建了多少“文本”对象,然后删除不可见的图形。

这就是情节在下面的样子:

screenshot

答案 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);

无论哪种方式,您都需要递归以展平单元格数组,然后计算。