使用模板如何计算x数的平均值?

时间:2015-09-29 08:19:46

标签: c++ math statistics

所以我有这个

的statistics.h
template<typename T>
class OwnType {
public:
    OwnType() {};
    virtual ~OwnType() {};

    void nextValue(T value) {
        nmbrCnt++;
        cout << "Value: " << value << endl;
        cout << "# of Values so far: " << nmbrCnt << endl;
        average = (average + value) / nmbrCnt; // calculate average <----- WRONG!

        variance += pow(value - average, 2) / nmbrCnt; // calculate standard variance/deviation
    };

    T getAverage() { return average; }
    T getVariance() { return variance; }
    T getRange() { return max - min; }

private:
    T max = NULL;
    T min = NULL;
    T average = NULL;
    double variance = 0;
    int nmbrCnt = 0;
    bool firstCall = true;
};

在main.cpp中我这样做:

void main() {
    OwnType<double> list;

    list.nextValue(10.5);
        cout << "Average: " << list.getAverage() << endl;
    list.nextValue(5);
        cout << "Average: " << list.getAverage() << endl;
    list.nextValue(3);
        cout << "Average: " << list.getAverage() << endl;
    list.nextValue(24.6)
        cout << "Average: " << list.getAverage() << endl;
    }

然而,似乎存在逻辑错误,或者我没有正确理解模板。我可以计算平均值就好了,如果它在数组中,但没有数组,没有任何存储空间,我很难过。任何iedas?

1 个答案:

答案 0 :(得分:0)

您的运行均值和方差的公式不正确。

我蒙特卡洛图书馆的一些代码可以帮助您:

 // Running variance calculation requires the previous value of the
 // mean so we do this one first.
 variance = path > 1 ? 
            (path - 1.0) / path * (variance + (mean - pv) * (mean - pv) / path) : 
             0.0;
 mean = ((path - 1.0) * mean + pv) / path;

此处,pv是要添加的新值,并且在合并新值后,path是分布中值的数量。

如果T是一个整数类型,那么请注意使用整数除法的截断效果。由于截断,您的运行平均值和方差将会恶化。

更好的是,完全抛弃模板并使用double