5

Boost アキュムレータを使用して、ローリング ウィンドウ全体の平均を追跡するコードがいくつかあります (「ローリング平均」)。ローリング平均に加えて、この同じローリング ウィンドウで最小値と最大値を追跡したいと考えています。

Boostアキュムレータを使用してローリング最小値とローリング最大値を計算する方法はありますか? 道が見えない…

ローリング平均に使用されるアキュムレータに最小タグと最大タグを追加しようとしましたが、それは私が望むものを与えません。

typedef accumulator_set<uint32_t, stats<tag::rolling_mean> > rollingMeanAcc_t;

になる

typedef accumulator_set<uint32_t, stats<tag::rolling_mean,tag::min,tag::max> > rollingMeanAcc_t;

ただし、ここで提供される最小値と最大値は、平均と同じローリング ウィンドウに限定されるのではなく、アキュムレータ全体で計算されます。

Boost のドキュメントには、ローリング ウィンドウに限定されず、すべてのサンプルで最小値と最大値が計算されることが記載されています。それらは、サンプルを制限または重み付けする方法を提供しているようには見えません。

ローリングウィンドウ全体で平均/最小/最大を報告できるようにしたいと考えています。

現在、Boost バージョン 1.48.0 を使用しています。最新バージョン (1.54.0) のドキュメントを確認しましたが、ローリング最小値/最大値が実装されていません。

スライディング ウィンドウの最小値を追跡するブースト以外の方法を見つけましたが、これも私が望むものではないようです。値が以前の最小値/最大値よりも大きい/小さいという理由だけで、値を削除したくありません。これは、rolling_mean が不正確になるためです。

4

2 に答える 2

7

アキュムレータがローリング最小/最大を実行できるとは思わない。

問題は非常に単純です。定義上、アキュムレータは O(1) データのみを使用します。処理中のデータは格納されません。数値が現在の最小値/最大値の範囲外になった場合に現在の最小値/最大値を変更するだけなので、O(1) データで最小値または最大値を維持できます。

ただし、ウィンドウの場合は、逆のことを行う準備が必要です。現在の最小値がウィンドウの外に出ると、新しい最小値 (ウィンドウ内で次に小さい数値) を見つける必要があります。もちろん、最大の場合も同様です。

ここで、(たとえば) 入力が並べ替えられた場合に最小値がどうなるかを考えてみましょう。ウィンドウからアイテムが削除されるたびに、異なる最小値が得られます。つまり、アキュムレータは、現在の最小値を適切に維持するために、すべてのデータをウィンドウに格納する必要があります。同様に、降順でソートされた入力で最大化します。

つまり、これにはアキュムレータを使用できません。すべてのデータをウィンドウに保存する必要があります。

于 2013-08-09T18:23:34.390 に答える