14

ブースト アキュムレータを使用して、ベクトルである変数の統計を計算したいと考えていました。これを行う簡単な方法はありますか。最もばかげたことを使用することは不可能だと思います:

  using namespace boost::accumulators;
  //stuff...

  accumulator_set<vector<double>, stats<tag::mean> > acc;
  vector<double> some_vetor;
  //stuff 
  some_vector = doStuff();
  acc(some_vector);

たぶんこれは明らかですが、とにかく試しました。:P

私が欲しかったのは、多くのベクトルの成分の平均であるベクトルを計算するアキュムレータを持つことでした。簡単な方法はありますか?

編集:

私が完全にクリアだったかどうかはわかりません。私はこれをしたくない:

 for_each(vec.begin(), vec.end(),acc); 

これは、指定されたベクトルのエントリの平均を計算します。必要なものが違います。ベクトルを吐き出す関数があります:

 vector<double> doSomething(); 
 // this is a monte carlo simulation;

そして、これを何度も実行して、それらのベクトルのベクトル平均を計算する必要があります。

  for(int i = 0; i < numberOfMCSteps; i++){
  vec = doSomething();
  acc(vec);
  }
  cout << mean(acc);

そして、 mean(acc) をベクトル自体にしたいと思います。そのエントリ [i] は、累積されたベクトルのエントリ [i] の平均になります。

Boostのドキュメントにはこれに関するヒントがありますが、明示的なものはありません。そして、私は少しばかです。:P

4

3 に答える 3

9

あなたの質問を少し調べましたが、Boost.Accumulators は既に のサポートを提供しているようですstd::vectorユーザーガイドのセクションで見つけたものは次のとおりです。

Numeric Operators Sub-Library が役立つもう 1 つの例は、型が統計計算に使用するために必要な演算子のオーバーロードを定義していない場合です。 たとえば、std::vector<>算術演算子をオーバーロードしませんがstd::vector<> 、サンプルまたは変数タイプとして使用すると便利な場合があります。Numeric Operators Sub-Library は、boost::numeric::operators 名前空間で必要な演算子のオーバーロードを定義します。これは、using ディレクティブを使用して Accumulators Framework によってスコープに取り込まれます。

実際、検証後、ファイルには「単純な」ソリューションが機能するために必要な演算子が含まれてboost/accumulators/numeric/functional/vector.hpp います。

試してみるべきだと思います:

  • どちらかを含む
    • boost/accumulators/numeric/functional/vector.hpp他のアキュムレータ ヘッダーの前
    • boost/accumulators/numeric/functional.hpp定義しながらBOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT
  • .を使用して演算子をスコープに入れるusing namespace boost::numeric::operators;

最後に 1 つだけ詳細が残っています。最初の累積値はデフォルトで構築されているため、実行時に実行が中断され、サイズnのベクトルを空のベクトルに追加しようとするとアサーションが発生します。このために、アキュムレータを次のように初期化する必要があるようです ( nはベクトル内の要素の数です)。

accumulator_set<std::vector<double>, stats<tag::mean> > acc(std::vector<double>(n));

次のコードを試してみたところ、meanサイズstd::vectorが 2 になりました。

int main()
{
    accumulator_set<std::vector<double>, stats<tag::mean> > acc(std::vector<double>(2));

    const std::vector<double> v1 = boost::assign::list_of(1.)(2.);
    const std::vector<double> v2 = boost::assign::list_of(2.)(3.);
    const std::vector<double> v3 = boost::assign::list_of(3.)(4.);
    acc(v1);
    acc(v2);
    acc(v3);

    const std::vector<double> &meanVector = mean(acc);
}

私はこれがあなたが望んでいたものだと思いますか?

于 2010-12-06T12:22:32.427 に答える
2

私は今試してみるためにセットアップしていませんが、boost::accumulators の必要性がすべて適切に定義された数学演算子である場合、別のベクター型で逃げることができるかもしれません: http://www.boost.org /doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm

于 2010-11-30T18:15:38.920 に答える
-3

ドキュメントはどうですか?

// The data for which we wish to calculate statistical properties:
std::vector< double > data( /* stuff */ );

// The accumulator set which will calculate the properties for us:    
accumulator_set< double, features< tag::min, tag::mean > > acc;

// Use std::for_each to accumulate the statistical properties:
acc = std::for_each( data.begin(), data.end(), acc );
于 2010-11-30T18:17:21.323 に答える