ブーストアキュムレーターをベクトルで使用することは可能ですか?
-
29-09-2019 - |
質問
Boost Accumulatorsを使用して、ベクトルである変数の統計を計算したかったのです。これを行う簡単な方法はありますか?愚かなものを使用することは不可能だと思います:
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);
そして、私は(ACC)がベクトル自体であることを意味します。そのエントリ[i]が蓄積されたベクトルのエントリ[i]の手段になります。
ブーストのドキュメントにはこれについてのヒントがありますが、明確なものはありません。そして、私は少し馬鹿です。 :p
解決
私はあなたの質問を少し調べましたが、boost.accumulatorsがすでにサポートを提供しているように思えます。 std::vector
. 。これが私が見つけることができるものです ユーザーガイドのセクション :
数値演算子のサブライブラリが役立つ別の例は、統計計算に使用するために必要なオペレーターの過負荷をタイプが定義しない場合です。 例えば、
std::vector<>
算術演算子を過負荷にしないでくださいが、使用すると便利かもしれませんstd::vector<>
サンプルまたはバリエットタイプとして。数値演算子のサブライブラリーは、必要な演算子の過負荷を定義しますboost::numeric::operators
名前空間。これは、使用を使用して蓄積者のフレームワークによって範囲になります。
実際、確認後、ファイル 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);
}
これがあなたが望んでいたものだと思いますか?
他のヒント
今すぐ試すように設定していませんが、すべてのBoost :: Accumulators needが適切に定義された数学演算子である場合、別のベクタータイプで逃げることができるかもしれません。 http://www.boost.org/doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm
そして、 ドキュメンテーション?
// 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 );