Function Objects
-
Hallo,
fällt jemandem auf die schnelle ein, wie ich folgenden code durch ein/meherer FunctionObject(s) ersetze:
double xpart[3 * n]; double mass[n]; /* Fülle xpart und mass */ /* Wähle Partikel aus */ vector<unsigned int> indices(); indices.push_back(3); indices.push_back(4); /* Berechne Schwerpunkt */ vector<unsigned int>::iterator it; for (it = indices.begin(); it != indices.end(); ++it) { octree.multipol.m += mass[*it]; } for (it = indices.begin(); it != indices.end(); ++it) { double * ptr = xpart + *it * 3; for (unsigned int j = 0; j < 3; ++j) { octree .multipol.x[j] += ptr[j] * mass[*it]; } } for (unsigned int i = 0; i < 3; ++i) { octree.multipol.x[i] /= octree.multipol.m; }Der obige Code implementiert
$\vec{y} = \frac{ \sum^n_{i=1} m\_i \cdot \vec{x}\_i } { \sum^n_{i=1} m_i }$Ich bin bereits komponentenweise vorgegangen, also
octree.multipol.m = accumulate(indices.begin(), indices.end(), ....); for_each(octree.multipol.x, octree.multipol.x+3, scale_and_add()); transform(octree.multipol.x, octree.multipol.x+3, bind2nd(divide(), octree.multipol.m));allerdings war die Geschwindingkeit ca. 1/3 langsamer. Ich habe den Code leider nicht mehr, so dass ich ihn hätte zeigen können.
Danke für eure Ideen.
-
Warum willst du den Code unleserlich und langsam machen und nicht so einfach lassen?