Frage

Ich wollte Boost-Akkumulatoren verwenden, um Statistiken einer Variablen zu berechnen, die ein Vektor ist. Gibt es eine einfache Möglichkeit, dies zu tun. Ich denke, es ist nicht möglich, das Dümmste, was zu verwenden:

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

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

vielleicht ist dies offensichtlich, aber ich habe es trotzdem versucht. : P

Was ich wollte, war einen Speicher zu haben, die einen Vektor berechnen würde, die die Mittel der Komponenten von vielen Vektoren ist. Gibt es einen einfachen Ausweg?

EDIT:

Ich weiß nicht, ob ich gut klar war. Ich will das nicht:

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

Dies würde die Mittel der Einträge eines bestimmten Vektors berechnen. Was ich brauche, ist anders. Ich habe eine Funktion, die Vektoren spucken:

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

Und ich brauche das viele Male laufen und berechnen die vektorielle Mittelwert dieser Vektoren:

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

Und ich will mean (acc) ein Vektor sein, selbst, dessen Eintrag [i] die Mittel der Einträge wären [i] der akkumulierten Vektoren.

Theres ein Hinweis dazu in der Dokumentation von Boost, aber nichts explizit. Und ich bin ein bisschen dumm. : P

War es hilfreich?

Lösung

Ich habe ein bisschen in Frage sieht, und es scheint mir, dass Boost.Accumulators bietet bereits Unterstützung für std::vector. Hier ist, was ich in ein Abschnitt der Führungs des Benutzers:

  

Ein weiteres Beispiel, bei dem die numerischen   Die Betreiber Sub-Bibliothek ist nützlich ist   wenn ein Typ wird nicht definiert, die   Betreiber Überlastung erforderlich, es zu benutzen   für einige statistische Berechnungen.    Zum Beispiel hat std::vector<> keine arithmetischen Operatoren überlastet, noch   kann es nützlich sein std::vector<> zu verwenden   als Probe oder variate Typ. Das   Numerische Operatoren Sub-Bibliothek definiert   die notwendigen Betreiber Überlastungen in   die boost::numeric::operators   Namensraum, der in Umfang gebracht wird   durch die Akkumulatoren Framework mit einem   using-Direktive.

der Tat, nach Überprüfung, die Datei boost/accumulators/numeric/functional/vector.hpp hat enthalten die notwendigen Operatoren für die 'naive' Lösung zu arbeiten.

Ich glaube, Sie sollten versuchen:

  • Einschließlich entweder
    • boost/accumulators/numeric/functional/vector.hpp vor allen anderen Akkumulatoren Header
    • boost/accumulators/numeric/functional.hpp bei der Definition BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT
  • bringt die Betreiber in Rahmen mit einem using namespace boost::numeric::operators;.

Es gibt nur eine letzte Detail links: Ausführung zur Laufzeit brechen, weil der anfängliche akkumulierten Wert default-konstruiert ist, und eine Assertion tritt auf, wenn ein Vektor der Größe hinzuzufügen versuchen, n , um einen leerer Vektor . Dazu scheint es Sie den Speicher initialisieren sollte (wobei n ist die Anzahl der Elemente in Ihrem Vektor):

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

Ich habe versucht, den folgenden Code, mean gibt mir eine std::vector der Größe 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);
}

Ich glaube, das ist das, was Sie wollten?

Andere Tipps

Ich habe nicht es bis jetzt versuchen, aber wenn alle boost :: Akkumulatoren müssen richtig mathematische Operatoren definiert ist, dann könnten Sie in der Lage sein, mit einem anderen Vektortyp wegzuzukommen: http://www.boost.org/doc/libs/1_37_0/libs /numeric/ublas/doc/vector.htm

Und was ist mit der

scroll top