rendered paste body// -*- mode: c++ -*-// $Id// http://www.bagley.org/~doug/shootout/// Calculate statistical moments of a region, from Bill Lear// Modified by Tamás Benkõ// Further modified by Tom Hyer//** Modified to generate data elements instead of load from disk//** Modified to use same math lib calls as the Java version//** Abbreviated output//** Added Timer() code#include <vector>#include <numeric>#include <iterator>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cmath>#include <ctime>#include <iostream>using namespace std;template <class T>class moments {public: template <class InputIterator> moments(InputIterator begin, InputIterator end) : median(0.0), mean(0.0), average_deviation(0.0) , standard_deviation(0.0), variance(0.0), skew(0.0) , kurtosis(0.0) { T sum = accumulate(begin, end, 0.0); size_t N = end - begin; mean = sum / N; for (InputIterator i = begin; i != end; ++i) { T deviation = *i - mean; average_deviation += fabs(deviation); //** //T temp = deviation * deviation; //variance += temp; variance += pow(deviation,2); //temp *= deviation; //skew += temp; variance += pow(deviation,3); //kurtosis += temp * deviation; kurtosis += pow(deviation,4); //** } average_deviation /= N; variance /= (N - 1); standard_deviation = sqrt(variance); if (variance) { skew /= (N * variance * standard_deviation); kurtosis = kurtosis/(N * variance * variance) - 3.0; } InputIterator mid = begin+N/2; nth_element(begin, mid, end); if (N % 2 == 0) { InputIterator next_biggest = max_element(begin,mid); median = (*mid+*next_biggest)/2; } else { median = *mid; } } T median; T mean; T average_deviation; T standard_deviation; T variance; T skew; T kurtosis;};int main(int argc, char *argv[]) { int n = ((argc == 2) ? atoi(argv[1]) : 1); clock_t start=clock(); while(n--) { vector<double> v; double d; const int max = 100000; for(d = 0; d < max; d++) v.push_back(d); moments<double> m(v.begin(), v.end());/* printf("n: %d\n", v.end() - v.begin()); printf("median: %f\n", m.median); printf("mean: %f\n", m.mean); printf("average_deviation: %f\n", m.average_deviation); printf("standard_deviation: %f\n", m.standard_deviation); printf("variance: %f\n", m.variance); printf("skew: %f\n", m.skew); printf("kurtosis: %f\n", m.kurtosis);*/ if(n == 1) { printf("%d,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f,%0.2f\n" ,v.end() - v.begin() ,m.median ,m.mean ,m.average_deviation ,m.standard_deviation ,m.variance ,m.skew ,m.kurtosis); } else { v.clear(); } } clock_t endt=clock(); std::cout <<"Time: " << double(endt-start)/CLOCKS_PER_SEC * 1000 << " ms\n"; return 0;}