All pastes #979654 Raw Edit

Untitled

public cpp v1 · immutable
·published 2008-04-10 14:35 UTC
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;}