1

次のパターンに従う値を保持するベクトル stdclock があります。

stdclock=[13 25 38 50 63 75 88 100 113 125 138 150 163 175 188 200 213 2517 2529 2542 2554 2567 2579 2592 2604 2617 2629 2642 2654 2667 2679 2692 2704 2717]

このデータは、12 個または 13 個離れた 17 個の値をエンコードすることによって生成されます (例: 25-13=12、38-25 = 13 など)。最初の 17 個の値がこのパターンに従っていることがわかります。17 個の値の各グループは、オブジェクトをエンコードします。これを「アイテム」と呼び、後続の 17 個の値から独立しています。次に、値 17 と 18 の間には、12 または 13 よりもはるかに大きな差がありますが、たとえば 15 よりも大きい数値になる可能性があります。この差は、最初の 17 の値が 1 つの項目をエンコードするような、データ内の質的な分離を表します。 、次の 17 の値は別のアイテムをエンコードするなどです。17 番目と 18 番目の値の差は 12 や 13 ほど小さくはなりません。このようにデータ。あるいは、

ここまでは順調ですね。問題は、このベクトルがハードウェアを介して生成されることです。ハードウェアでは、1 つまたは複数の値が単純に削除されて記録されないなどのエラーが発生することがあります。「アイテム」から値が欠落していることを検出し、そのアイテムから残りのすべての値を削除するアルゴリズムを見つけたいです。

エラーのすべてのパターンで機能する方法でこれを行う方法について頭を悩ませることはできません(たとえば、アイテムが任意のパターンでどこでも番号が欠落している可能性があり、隣接するアイテムも任意の場所で番号が欠落している可能性がある場合)パターン、またはどこにもありません)。

どんな助けでも大歓迎です。「破損した」アイテムの例は次のようになります

stdclock=[13 25 38 50 63 75 88 100 113 125 138 150 163 175 188 200 213 2529 2542 2554 2567 2579 2592 2604 2642 2654 2679 2692 2704]

この stdclock は上のものと同じですが、2 番目の項目を調べて、最初と最後の数字を含む数字をランダムに削除しました。

4

1 に答える 1

2

連続するグループ間の差が常にあるしきい値よりも大きいと仮定できる場合は、次のアプローチを使用できます: 連続するグループを識別し、長さが 17 未満のすべてのグループを破棄します。新しいグループのしきい値がデータポイントが欠落すると、17 のグループが 2 つの短いグループに分割され、両方が削除されるため、15 まで低く設定できます。

stdclock=[13 25 38 50 63 75 88 100 113 125 138 150 163 175 188 200 213 2529 2542 2554 2567 2579 2592 2604 2642 2654 2679 2692 2704];

%# a difference of more than groupDelta indicates a new (pseudo-)group
groupDelta = 15; 
groupJump = [1 diff(stdclock) > groupDelta];

%# number the groups
groupNumber = cumsum(groupJump);

%# count, for each group, the numbers. 
groupCounts = hist(groupNumber,1:groupNumber(end));

%# if a group contains fewer than 17 entries, throw it out
badGroup = find(groupCounts < 17);
stdclock(ismember(groupNumber,badGroup)) = [];


stdclock =
    13    25    38    50    63    75    88   100   113   125   138   150   163   175   188   200   213
于 2012-08-12T23:47:03.047 に答える