7

「ネストされた」セルの要素を含む、セル配列のすべての要素を数えたい。

セル配列の場合

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

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

答えはです10

1つの方法は[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

これを関数に入れます(たとえば)( MATLAB Centralflatten.mのコード):

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 に答える