2016-03-29 14 views
0

Hier geht es darum, das arithmetische Mittel der Rückgabewerte einer Funktion zu berechnen.Gibt es einen schnelleren Weg, um den Mittelwert von Funktionsergebnissen als Generieren/Akkumulieren zu berechnen?

Um einen Mittelwert von N Funktion Anrufe zu bekommen, habe ich gedacht:

std::vector<double> results(N); 
std::generate(results.begin(), results.end(), my_function(...)); 
double mean = std::accumulate(results.begin(), results.end(), 0.0)/N; 

Gibt es einen Standard/moderne C++, wie es schneller zu machen oder den Zwischenvektor weglassen? Boost ist auch eine Option.

+0

Das ist nicht der Durchschnitt, es ist der Durchschnitt, den Sie berechnen. Und dafür müssen Sie alle Werte summieren, es gibt keine Abkürzung (es sei denn, es ist akzeptabel mit einem ungefähren (und möglicherweise falschen) Wert). –

+0

@JoachimPileborg Das ist die Definition des Mittelwerts. –

+0

@JoachimPileborg Ein ** arithmetisches Mittel ** bedeutet Durchschnitt – NathanOliver

Antwort

3

Sie haben die Funktion N mal anrufen, aber Sie können etwas Platz sparen tun Berechnungen im Fluge:

double mean = 0; 
for (int i = 0; i < N; ++i) 
    mean += my_function(...); 
mean /= N; 

Update: möglich moderne einzeilige Ansatz mit boost:

double mean = std::accumulate(
    boost::make_function_input_iterator(my_func, 0), 
    boost::make_function_input_iterator(my_func, N), 0.0)/N; 
+0

Das OP bat um einen ** modernen ** C++ - Weg, um dies zu erreichen. Eine handgeschriebene Schleife fühlt sich nicht sehr modern an. ;-) –

+4

@ ChrisJester-Young - Nein, einfache Sachen kompliziert zu machen ist sehr modern :-) – 4386427

+0

Ein Bereich basierend auf for-loop wird modern sein, indem man Bereiche ohne Container erstellt :) – knivil

2

Mit range-v3:

auto mean = ranges::accumulate(
        ranges::view::generate_n([]{ return my_function(...); }, N), 
        0.0)/N; 
+0

Ist das schneller als die von @AntonSavin vorgeschlagene Lösung? – 4386427

+1

@ 4386427 - Die Loop-Lösung ist fast sicher schneller (und offensichtlicher) als beide. Manchmal bedeutet modern nicht besser. Dies ist einer von denen manchmal. –

+0

@DavidHammen Offensichtlich ist im Auge des Betrachters, aber in der Leistung sollte es mit einem anständigen Optimierer gleichwertig sein. –

Verwandte Themen