Calculate rolling / moving average in C++

前端 未结 10 2109
攒了一身酷
攒了一身酷 2020-12-02 08:09

I know this is achievable with boost as per:

Using boost::accumulators, how can I reset a rolling window size, does it keep extra history?

But I really would

10条回答
  •  佛祖请我去吃肉
    2020-12-02 08:51

    Simple class to calculate rolling average and also rolling standard deviation:

    #define _stdev(cnt, sum, ssq) sqrt((((double)(cnt))*ssq-pow((double)(sum),2)) / ((double)(cnt)*((double)(cnt)-1)))
    
    class moving_average {
    private:
        boost::circular_buffer *q;
        double sum;
        double ssq;
    public:
        moving_average(int n)  {
            sum=0;
            ssq=0;
            q = new boost::circular_buffer(n);
        }
        ~moving_average() {
            delete q;
        }
        void push(double v) {
            if (q->size() == q->capacity()) {
                double t=q->front();
                sum-=t;
                ssq-=t*t;
                q->pop_front();
            }
            q->push_back(v);
            sum+=v;
            ssq+=v*v;
        }
        double size() {
            return q->size();
        }
        double mean() {
            return sum/size();
        }
        double stdev() {
            return _stdev(size(), sum, ssq);
        }
    
    };
    

提交回复
热议问题