Ist es möglich, Boost-Speicher mit Vektoren zu benutzen?
-
29-09-2019 - |
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
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 seinstd::vector<>
zu verwenden als Probe oder variate Typ. Das Numerische Operatoren Sub-Bibliothek definiert die notwendigen Betreiber Überlastungen in dieboost::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 DefinitionBOOST_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