是否可以使用带向量的增压累加器?

Raf*_*ini 13 c++ templates boost accumulator

我想使用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);
Run Code Online (Sandbox Code Playgroud)

也许这很明显,但无论如何我都试过了.:P

我想要的是有一个累加器来计算一个向量,它是许多向量的分量的平均值.有一个简单的方法吗?

编辑:

我不知道我是否彻底清楚.我不想要这个:

 for_each(vec.begin(), vec.end(),acc); 
Run Code Online (Sandbox Code Playgroud)

这将计算给定矢量的条目的平均值.我需要的是不同的.我有一个将吐向量的函数:

 vector<double> doSomething(); 
 // this is a monte carlo simulation;
Run Code Online (Sandbox Code Playgroud)

我需要多次运行并计算这些向量的矢量平均值:

  for(int i = 0; i < numberOfMCSteps; i++){
  vec = doSomething();
  acc(vec);
  }
  cout << mean(acc);
Run Code Online (Sandbox Code Playgroud)

我希望mean(acc)是一个向量本身,其entry [i]将是累积向量的条目[i]的平均值.

在Boost的文档中有关于此的暗示,但没有任何明确的.而我有点愚蠢.:P

ice*_*ime 9

我已经调查了一下你的问题,在我看来,Boost.Accumulators已经提供了支持std::vector.以下是我在用户指南的一部分中可以找到的内容:

数值运算符子库有用的另一个示例是类型未定义将其用于某些统计计算所需的运算符重载. 例如,std::vector<>不会使任何算术运算符重载,但是将其std::vector<> 用作样本或变量类型可能很有用.Numeric Operators子库在boost::numeric::operators 命名空间中定义必要的运算符重载,由Accumulators Framework使用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));
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码,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);
}
Run Code Online (Sandbox Code Playgroud)

我相信这就是你想要的?