「ネストされた」セルの要素を含む、セル配列のすべての要素を数えたい。
セル配列の場合
>> C = {{{1,2},{3,4,5}},{{{6},{7},{8}},{9}},10}
C = {1x2 cell} {1x2 cell} [10]
答えはです10
。
1つの方法は[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)
基本的に、非表示の図形を作成し、セル配列をプロットし、作成された「テキスト」オブジェクトの数を数えてから、非表示の図形を削除します。
下のプロットは次のようになります。
これを関数に入れます(たとえば)( 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);
いずれにせよ、セル配列をフラット化してからカウントするために再帰する必要があります。