各コンテナ要素の『平均・分散・標準偏差』を計算するコード
たまに必要になるんだけど、毎回書き直しているのでメモっておく。
テストコードの結果はR言語と揃ってるのは確認済。
#include <iostream> #include <cmath> #include <vector> #include <list> #include <numeric> template <template<class T, class Allocator = std::allocator<T> > class Container> double mean(Container<double> & x) { return std::accumulate(x.begin(), x.end(), 0.0) / x.size(); } template <template<class T, class Allocator = std::allocator<T> > class Container> double var(Container<double> & x) { double size = x.size(); double x_mean = mean(x); return (std::inner_product(x.begin(), x.end(), x.begin(), 0.0) - x_mean * x_mean * size)/ (size - 1.0); } template <template<class T, class Allocator = std::allocator<T> > class Container> double sd(Container<double> & x) { return std::sqrt(var(x)); } int main() { std::vector<double> x; x.push_back(1); x.push_back(2); x.push_back(3); x.push_back(4); std::list<double> y(x.begin(), x.end()); std::cout << mean(x) << std::endl; std::cout << mean(y) << std::endl; std::cout << var(x) << std::endl; std::cout << var(y) << std::endl; std::cout << sd(x) << std::endl; std::cout << sd(y) << std::endl; return 0; }
実行結果
2.5 2.5 1.66667 1.66667 1.29099 1.29099