2010-11-30 8 views
13

Quería usar acumuladores de impulso para calcular 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 estúpida:¿Es posible usar acumuladores de refuerzo con vectores?

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 es tener un acumulador que calcule un vector que es la media de los componentes de muchos vectores. ¿Hay una salida fácil?

EDIT:

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

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

Esto calcularía 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 necesito para ejecutar esto muchas veces y calcular el vectorial significa de esos vectores:

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

Y quiero decir (ACC) a ser un vector en sí, cuya entrada [i] sería el medio de las entradas [i] de los vectores acumulados.

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

+1

Mind blown. He usado bastante el Boost Acumulator y nunca aprendí que es compatible con tipos de muestra no escalares. – sehe

Respuesta

9

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 a section of the user's guide:

Otro ejemplo en el que los operadores numérico Sub-biblioteca es útil es cuando un tipo no define los sobrecargas de operadores necesarios para utilizarlo para algunos cálculos estadísticos. Por ejemplo, std::vector<> no sobrecarga ningún operador aritmético, sin embargo, puede ser útil usar std::vector<> como muestra o tipo de variable. Los operadores numéricos Sub-Library define las sobrecargas de operadores necesarios en la boost::numeric::operators de espacios de nombres, que se pone en alcance por el Marco Acumuladores con una directiva using .

De hecho, después de la verificación, el archivo boost/accumulators/numeric/functional/vector.hpphace contiene los operadores necesarios para la solución de 'ingenua' para trabajar.

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 el ámbito de una using namespace boost::numeric::operators; .

Sólo hay un detalle a la izquierda: 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)); 

He probado el siguiente código, mean me da un 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?

+0

Probablemente sí! Lo intentaré aquí. Solo un minuto. –

+0

Tengo problemas para compilar esto, pero creo que es correcto. –

+0

@Rafael: He editado mi respuesta sobre la compilación: o bien incluya '[/]/numérico/funcional/vector.hpp' antes que cualquier otra cosa, o incluya' [/]/numérico/funcional.hpp' mientras definiendo 'BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT' – icecrime

2

No tengo configurado para tratar en este momento, pero si todos los boost :: acumuladores necesitan operadores matemáticos se define correctamente, entonces usted podría ser capaz de salirse con un tipo diferente de vectores: http://www.boost.org/doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm

+0

Este es probablemente el camino. Pero estoy obteniendo un error de tiempo de ejecución de discrepancia de tamaño con ublas :: vector. Pero gracias, esto es probablemente lo que funcionará. –

+1

Estoy tratando de obtener ayuda en la comunidad boost :: ublas. Si logro hacerlo funcionar, publicaré una solución aquí. –

-3

¿Y qué pasa con el 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

Creo que quiere un vector de medios para un grupo de vectores, ni un solo significado para un solo vector, pero puedo estar equivocado. – Eclipse

+1

Tendremos que esperar por él y ver :) –

+0

Eclipse lo tiene. Admito que es un poco confuso. Quiero un acumulador que acumule vectores y devuelva un vector malo. –

Cuestiones relacionadas