8#ifndef DESIGNLAB_AVERAGE_CALCULATOR_H_
9#define DESIGNLAB_AVERAGE_CALCULATOR_H_
20template <typename T, typename = std::enable_if_t<std::is_arithmetic<T>::value>>
26 average_(
std::nullopt),
27 variance_(
std::nullopt),
28 standard_deviation_(
std::nullopt) {}
35 void AddData(
const T& data,
const bool do_calc =
true) {
36 data_.push_back(data);
38 if (sum_.has_value()) {
39 sum_ = sum_.value() + data;
54 average_ = std::nullopt;
55 variance_ = std::nullopt;
56 standard_deviation_ = std::nullopt;
63 average_ = std::nullopt;
64 variance_ = std::nullopt;
65 standard_deviation_ = std::nullopt;
70 average_ = sum_.value() / data_.size();
75 for (
const auto& data : data_) {
76 variance_sum += (data - average_.value()) * (data - average_.value());
78 variance_ = variance_sum / data_.size();
81 standard_deviation_ = sqrt(variance_.value());
102 std::optional<T>
GetSum()
const {
return sum_; }
105 std::vector<T> data_;
106 std::optional<T> sum_;
107 std::optional<T> average_;
108 std::optional<T> variance_;
109 std::optional<T> standard_deviation_;
平均値,分散,標準偏差を求めるテンプレートクラス.
std::optional< T > GetVariance() const
分散を取得する.
void Calculate()
平均値,分散,標準偏差を計算する.
std::optional< T > GetSum() const
データの合計を取得する.
size_t GetDataNum() const
データ数を取得する.
std::optional< T > GetAverage() const
平均値を取得する.
std::optional< T > GetStandardDeviation() const
標準偏差を取得する.
void AddData(const T &data, const bool do_calc=true)
データを追加する. この関数を呼び出すたびに,平均値,分散,標準偏差が再計算される.