Pregunta

quería utilizar acumuladores de impulso para calcular las estadísticas de una variable que es un vector. ¿Hay una manera simple de hacer esto. Creo que no es posible usar la cosa más tonta:

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

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

Tal vez esto es obvio, pero lo intentó de todos modos. : P

Lo que quería era tener un acumulador que calcular un vector que es la media de los componentes de muchos vectores. ¿Hay una manera de salir fácil?

EDIT:

No sé si estaba completamente claro. No quiero esto:

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

Esto sería calcular la media de las entradas de un vector dado. Lo que necesito es diferente. Tengo una función que va a escupir vectores:

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

Y se necesita para ejecutar esto muchas veces y calcular el vectorial media de esos vectores:

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

Y quiero media (acc) para ser un vector propio, cuya entrada [i] sería el medio de las entradas [I] de los vectores acumulados.

Hay un indicio de esto en los documentos de Boost, pero nada explícito. Y yo soy un poco tonto. : P

¿Fue útil?

Solución

He mirado en su pregunta un poco, y me parece que ya Boost.Accumulators proporciona soporte para std::vector. Esto es lo que pude encontrar en una sección de la guía del usuario :

  

Otro ejemplo en el que el Numeric   Operadores Sub-biblioteca es útil es   cuando un tipo no define el   sobrecargas de operadores obligados a utilizarlo   para algunos cálculos estadísticos.    Por ejemplo, std::vector<> no sobrecargar todos los operadores aritméticos, sin embargo,   puede ser útil para utilizar std::vector<>   como una muestra o variate tipo. los   define numérico Operadores Sub-Library   las sobrecargas de operadores necesarios en   la boost::numeric::operators   espacio de nombres, que se pone en alcance   por el Marco Acumuladores con una   usando la directiva.

De hecho, después de la verificación, el boost/accumulators/numeric/functional/vector.hpp archivo hace contener los operadores necesarios para la solución de 'ingenua' de trabajo.

Creo que debería probar:

  • incluyendo o bien
    • boost/accumulators/numeric/functional/vector.hpp antes de cualquier otra acumuladores de cabecera
    • boost/accumulators/numeric/functional.hpp mientras se define BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT
  • Llevar a los operadores en alcance con un using namespace boost::numeric::operators;.

Sólo hay un detalle dejó: la ejecución se romperá en tiempo de ejecución debido a que el valor acumulado inicial es default-construida, y una aserción se producirá cuando se trata de añadir un vector de tamaño n a un vector vacío . Para esto, parece que debe inicializar el acumulador con (donde n es el número de elementos en el vector):

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

Me trató el siguiente código, mean me da una std::vector de tamaño 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);
}

Creo que esto es lo que quería?

Otros consejos

No tengo que creó para tratar en este momento, pero si todo impulso :: acumuladores necesidad se define adecuadamente los operadores matemáticos, entonces usted podría ser capaz de salirse con un tipo de vector diferente: http://www.boost.org/doc/libs/1_37_0/libs /numeric/ublas/doc/vector.htm

Y qué pasa con el documentación ?

// 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 );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top