7

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

对于元胞数组

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

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

答案应该是10

一种方法是[C{:}]重复使用,直到没有单元格留下,然后使用numel但必须有更好的方法?

4

2 回答 2

9

由于您只对元素的数量感兴趣,因此这是@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)

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

这是情节在下面的样子:

截屏

于 2012-07-03T10:17:29.403 回答
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))找到元素的总数。

如果你不喜欢创建一个单独的函数,你可以使用这段聪明(但讨厌)的代码来定义一个使用匿名函数的扁平化函数(代码来自这里):

flatten = @(nested) feval(Y(@(flat) @(v) foldr(@(x, y) ifthenelse(iscell(x) | iscell(y), @() [flat(x), flat(y)], @() {x, y}), [], v)), nested);

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

于 2012-07-03T10:06:49.177 回答