14

我想使用 boost 累加器来计算一个向量变量的统计数据。有没有一种简单的方法可以做到这一点。我认为不可能使用最愚蠢的东西:

  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 有用的另一个示例是,当类型未定义将其用于某些统计计算所需的运算符重载时。 例如,std::vector<>不会重载任何算术运算符,但std::vector<> 用作样本或变量类型可能很有用。数值运算符子库在boost::numeric::operators 命名空间中定义了必要的运算符重载,由累加器框架使用 using 指令引入范围。

事实上,经过验证,该文件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;

只剩下最后一个细节:执行将在运行时中断,因为初始累积值是默认构造的,并且在尝试将大小为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 回答