3

配列内の繰り返しセグメントを使用して要素をグループ化したい。ブレークは基本的に繰り返されるセグメントがどこにあるかに依存します。私の実際のデータには約10000の要素が含まれており、それを行う簡単な方法があるかどうかを知りたいです。

これが私が欲しいものを明確にするための短い例です:

配列があるとしましょう、

A=[1 5 3 4 4 4 6 9 8 8 9 5 2];

私が欲しいのは侵入Aすることです[1 5 3],[6 9], and [9 5 2];

matlabを使用してこれをコーディングするのが最も簡単なのは何ですか?

ありがとう。

4

2 に答える 2

3

ベクトル化されたソリューションの場合、隣接するものとの前方または後方の差がゼロである場所を見つけて、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)])
于 2012-08-22T19:39:38.237 に答える
1

質問を正しく理解した場合に機能する解決策を次に示します。おそらくさらに最適化することができます。

A=[1 5 3 4 4 4 6 9 8 8 9 5 2];

% //First get logical array of non consecutive numbers
x = [1 (diff(A)~=0)];
for nn=1:numel(A)
    if ~x(nn)
        if x(nn-1)            
            x(nn-1)=0;
        end
    end
end


% //Make a cell array using the logical array
y = 1+[0 cumsum(diff(find(x))~=1)];
x(x~=0) = y;
for kk = unique(y)
    B{kk} = A(x==kk);
end

B{:}
于 2012-08-22T18:37:04.647 に答える