2010-11-30 6 views
13

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

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); 

これは、与えられたベクトルのエントリーの平均を計算するだろう。私が必要とするのは違う。する

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

そして、私は(ACC)を意味します:私はベクトルを吐くだろう機能があります。

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

をそして私はこれを何度も実行しては、これらのベクトルのを意味ベクトル計算する必要がありますベクトル自体であり、そのエントリー[i]は、累積されたベクトルのエントリー[i]の手段となる。

これについてのヒントはBoostのドキュメントにありますが、明示的なものではありません。私はちょっとばかだ。 :P

+1

マインドブロー。私はBoost Accumulatorをかなり使いましたが、スカラーでないサンプルのタイプをサポートしていることは決してありませんでした。 – sehe

答えて

9

私はあなたの質問にビットを見てきた、そしてBoost.Accumulatorsはすでにstd::vectorためのサポートを提供するように私には思えます。ここで私はa section of the user's guideで見つけることができるものである:タイプは、いくつかの統計計算のためにそれ を使用するために必要な 演算子のオーバーロードを定義していないとき

数値 演算子サブライブラリーが有用である別の例は です。 たとえば、std::vector<>は算術演算子に負担をかけませんが、 std::vector<> をサンプルまたは変量タイプとして使用すると便利です。 数値演算子サブライブラリーは、ディレクティブを使用して とアキュムレータFrameworkによる範囲 になる boost::numeric::operators名前空間に 必要なオペレータのオーバーロードを定義します。

実際、検証した後、ファイルboost/accumulators/numeric/functional/vector.hppないは、「ナイーブ」ソリューションが動作するために必要な演算子を含みます。

私はあなたが試してみてくださいと信じて:

  • boost/accumulators/numeric/functional/vector.hppのいずれかを含む

    • using namespace boost::numeric::operators;とスコープに演算子を持ち込みBOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT
  • を定義しながら、他のアキュムレータが
  • boost/accumulators/numeric/functional.hppをヘッダの前に。

唯一の最後のディテールがあります左:初期累積値がデフォルトに構成しているため、実行には、実行時に破壊されると、空のベクターにサイズn個のベクトルを追加しようとすると、アサーションが発生します。このために、あなたが(どこNはあなたのベクトルの要素の数である)でアキュムレータを初期化する必要がありそうです:

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

私は、次のコードを試してみました、meanは私にサイズ2のstd::vectorを与える:

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); 
} 

私はこれがあなたが望んだと信じていますか?

+0

おそらくはい!私はここでそれを試してみましょう。ほんの一分。 –

+0

これをコンパイルするのに問題がありますが、正しいと思います。 –

+0

@Rafael:私はコンパイルに関する私の答えを編集しました。それ以外のものの前に '[...]/numeric/functional/vector.hpp'を含めたり、' [...]/numeric/functional.hpp'を含めます'BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT'を定義しています – icecrime

2

私はそれが今しようとするように設定されていませんが、すべてのブースト::アキュムレータが必要が適切に数学的な演算子を定義されている場合、あなたは別のベクトル型に逃げることができるかもしれません:http://www.boost.org/doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm

+0

これはおそらく方法です。しかし、私はサイズの不一致のランタイムエラーが発生しているublas :: vector。しかし、ありがとう、これはおそらく動作するでしょう。 –

+1

私はboost :: ublasコミュニティで助けを得ようとしています。私がそれを動作させることができれば、私はここに解決策を掲示します。 –

-3

そして、documentationはどうですか?

// 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); 
+1

私は彼がベクトルの束のための手段のベクトルを望んでいると思う、単一のベクトルのための単一の平均ではないが、私は間違っているかもしれない。 – Eclipse

+1

私たちは彼を待って見てください:) –

+0

Eclipseはそれを得ました。私はちょっと混乱していると認めます。ベクトルを累積して平均ベクトルを返すアキュムレータが必要です。 –

関連する問題