2016-03-29 39 views
0

Bu, bir işlevin dönüş değerlerinin aritmetik ortalamasının hesaplanmasıyla ilgilidir.İşlev sonuçlarının ortalama değerini hesaplamak/biriktirmek yerine hesaplamak için daha hızlı bir yol var mı?

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

orta vektör hızlı yapmak veya atlamak için bir standart/Modern C++ yolu var mı:

N bir işlev arama ortalamasını almak için, düşündünüz mü? Boost da bir seçenektir.

+0

Bu ortalama değil, hesapladığınız ortalama. Ve bunun için tüm değerleri toplamanız gerekir, kısayol yoktur (bunun yerine, yaklaşık olarak (ve muhtemelen yanlış) bir değerle kabul edilemezse). –

+0

@JoachimPileborg Bu _is_ ortalamanın tanımı. –

+0

@JoachimPileborg Bir ** aritmetik ortalama ** ortalama – NathanOliver

cevap

3

Sen fonksiyonunu N kez aramak zorunda ama anında hesaplamalar yapıyor bazı yerden tasarruf edebilirsiniz:

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

Güncelleme: Mümkün Modern tek satırlı bir yaklaşım kullanarak 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

OP, bunu başarmak için ** modern ** C++ yolunu sordu. Elle yazılmış bir döngü çok modern hissetmez. ;-) –

+4

@ ChrisJester-Young - Hayır, basit işleri karmaşık hale getirmek çok modern :-) – 4386427

+0

Kapsayıcı olmayan bir aralık tabanlı bir dizi, konteyner olmadan aralıklar inşa ederek modern olacak :) – knivil

2

range-v3 ile:

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

Bu, @AntonSavin tarafından önerilen çözümden daha mı hızlı? – 4386427

+1

@ 4386427 - Döngü çözümü, bunlardan herhangi birinden neredeyse kesinlikle daha hızlıdır (ve daha belirgin). Bazen modern, daha iyi anlamına gelmez. Bu bazen onlardan biri. –

+0

@DavidHammen Obvious, izleyicinin gözünde, ancak performans açısından iyi bir iyileştirici ile eşdeğer olmalıdır. –