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?


Anmelden zum Antworten