演算法
accumulate 求和。
- 平均值 = 和 / n。
- 用
for_each + lambda 累加平方差。
- 樣本標準差 = sqrt(平方差和 / (n-1))。
程式碼
#include <vector>
#include <numeric>
#include <algorithm>
#include <cmath>
vector<double> resultSet = { /* ... */ };
double sum = accumulate(begin(resultSet), end(resultSet), 0.0);
double mean = sum / resultSet.size();
double accum = 0.0;
for_each(begin(resultSet), end(resultSet),
[&](double d) { accum += (d - mean) * (d - mean); });
double stdev = sqrt(accum / (resultSet.size() - 1));
注意
- 總體標準差分母用
n,樣本用 n-1(貝塞爾修正)。
- 大數據量時考慮 Welford 單遍歷演算法提升數值穩定度。
- C++17 可用
std::reduce(平行化)替代 accumulate。