Est-il possible d'utiliser des accumulateurs de boost avec des vecteurs?
-
29-09-2019 - |
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
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'utiliserstd::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 leboost::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éfinissantBOOST_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