ベクトル化されたソリューションの場合、隣接するものとの前方または後方の差がゼロである場所を見つけて、bwlabel
(Image Processing Toolboxから)を使用accumarray
してデータを収集できます。
A=[1 5 3 4 4 4 6 9 8 8 9 5 2];
d = diff(A)==0;
%# combine forward and backward difference
%# and invert to identify non-repeating elments
goodIdx = ~([d,false]|[false,d]);
%# create list of group labels using bwlabel
groupIdx = bwlabel(goodIdx);
%# distribute the data into cell arrays
%# note that the first to inputs should be n-by-1
B = accumarray(groupIdx(goodIdx)',A(goodIdx)',[],@(x){x})
編集
繰り返し要素をセル配列にも表示する場合は、コードの最後の2行を次のように置き換えます。
groupIdx = cumsum([1,abs(diff(goodIdx))]);
B = accumarray(groupIdx',A',[],@(x){x})
EDIT2
同じ番号の連続したグループも分割できるようにする場合はgroupIdx
、次のように計算する必要があります。
groupIdx = cumsum([1,abs(diff(goodIdx))|~d.*~goodIdx(2:end)])