分散 variance
結構前に作ったんですが、STL となるべく互換性を持たせて作った分散を求める関数。内容も短いしイテレータさえあれば使えるので便利かも?
#include <cmath> #include <iterator> #include <numeric> /*! variance between iterators 'b' and 'e' with average 'a'. */ template <typename V, typename InItr> inline V variance(InItr b, InItr e, V a) { const typename std::iterator_traits<InItr>::difference_type n = std::distance(b, e); // size V v = 0; // variance for (; b != e; ++b) v += std::pow(a - *b, 2); return v / n; } /*! variance between iterators 'b' and 'e'. */ template <typename V, typename InItr> inline V variance(InItr b, InItr e) { const typename std::iterator_traits<InItr>::difference_type n = std::distance(b, e); return variance(b, e, std::accumulate(b, e, static_cast<V>(0)) / n); } int main() { const int array[10] = {1,2,3,4,5,6,7,8,9,0}; double v = variance<double>(array, array + 10); }