¿Es posible utilizar acumuladores impulsar con vectores?
-
29-09-2019 - |
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
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 utilizarstd::vector<>
como una muestra o variate tipo. los define numérico Operadores Sub-Library las sobrecargas de operadores necesarios en laboost::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 defineBOOST_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 );