Question

Je voulais utiliser des accumulateurs de coup de pouce pour calculer les statistiques d'une variable qui est un vecteur. Est-il un moyen simple de le faire. Je pense qu'il est impossible d'utiliser la chose la plus stupide:

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

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

est peut-être évident, mais j'ai essayé quand même. : P

Ce que je voulais était d'avoir un accumulateur qui calculerait un vecteur qui est la moyenne des composants de nombreux vecteurs. Y at-il un moyen facile out?

EDIT:

Je ne sais pas si je suis bien clair. Je ne veux pas ceci:

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

calculerait la moyenne des entrées d'un vecteur donné. Ce que je dois est différent. J'ai une fonction qui crache des vecteurs:

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

Et je dois courir cela plusieurs fois et calculer la vectorial moyenne de ces vecteurs:

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

Et je veux moyenne (acc) soit un vecteur lui-même, dont l'entrée [i] serait le moyen des entrées [i] des vecteurs accumulés.

Theres une allusion à ce sujet dans les docs de Boost, mais rien d'explicite. Et je suis un peu stupide. : P

Était-ce utile?

La solution

Je l'ai regardé dans votre question un peu, et il me semble que Boost.Accumulators fournit déjà un soutien pour std::vector. Voici ce que je pouvais trouver dans une section de guide de l'utilisateur :

  

Un autre exemple où le numérique   Les opérateurs sous-bibliothèque est est utile   lorsqu'un type ne définit pas la   opérateur requis surcharge pour l'utiliser   pour certains calculs statistiques.    Par exemple, std::vector<> ne pas surcharger les opérateurs arithmétiques, mais   il peut être utile d'utiliser std::vector<>   comme un type d'échantillon ou variable aléatoire. le   Les opérateurs numériques définit la sous-bibliothèque   les opérateurs nécessaires surcharges en   le boost::numeric::operators   espace de noms, qui est mise en portée   par le cadre d'une Accumulateurs   avec la directive.

En effet, après vérification, le fichier boost/accumulators/numeric/functional/vector.hpp Finalité contenir les opérateurs nécessaires à la solution 'naïve' au travail.

Je crois que vous devriez essayer:

  • Y compris soit
    • boost/accumulators/numeric/functional/vector.hpp avant tout autre accumulateurs tête
    • boost/accumulators/numeric/functional.hpp tout en définissant BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT
  • Apporter les opérateurs dans le périmètre d'un using namespace boost::numeric::operators;.

Il n'y a qu'un seul détail à gauche: l'exécution se briser à l'exécution parce que la valeur initiale accumulée est construite par défaut, et une assertion se produit lorsque vous essayez d'ajouter un vecteur de taille n à un vecteur vide . Pour cela, il semble que vous devez initialiser l'accumulateur avec (où n est le nombre d'éléments dans votre vecteur):

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

J'ai essayé le code suivant, mean me donne un std::vector de taille 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);
}

Je crois que c'est ce que vous vouliez?

Autres conseils

Je ne l'ai pas mis en place pour essayer dès maintenant, mais si tout boost :: besoin d'accumulateurs est des opérateurs mathématiques correctement défini, alors vous pourriez être en mesure de sortir avec un autre type de vecteur: http://www.boost.org/doc/libs/1_37_0/libs /numeric/ublas/doc/vector.htm

scroll top