GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
average_calculator.h
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
8#ifndef DESIGNLAB_AVERAGE_CALCULATOR_H_
9#define DESIGNLAB_AVERAGE_CALCULATOR_H_
10
11#include <cmath>
12#include <optional>
13#include <vector>
14
15namespace designlab {
16
20template <typename T, typename = std::enable_if_t<std::is_arithmetic<T>::value>>
21class AverageCalculator final {
22 public:
24 : data_(),
25 sum_(std::nullopt),
26 average_(std::nullopt),
27 variance_(std::nullopt),
28 standard_deviation_(std::nullopt) {}
29
35 void AddData(const T& data, const bool do_calc = true) {
36 data_.push_back(data);
37
38 if (sum_.has_value()) {
39 sum_ = sum_.value() + data;
40 } else {
41 sum_ = data;
42 }
43
44 if (do_calc) {
45 Calculate();
46 }
47 }
48
51 void Clear() {
52 data_.clear();
53 sum_ = std::nullopt;
54 average_ = std::nullopt;
55 variance_ = std::nullopt;
56 standard_deviation_ = std::nullopt;
57 }
58
60 void Calculate() {
61 // データが空の場合は,平均値,分散,標準偏差を nullopt にする.
62 if (data_.empty()) {
63 average_ = std::nullopt;
64 variance_ = std::nullopt;
65 standard_deviation_ = std::nullopt;
66 return;
67 }
68
69 // 平均値を求める.
70 average_ = sum_.value() / data_.size();
71
72 // 分散を求める.
73 T variance_sum = 0;
74
75 for (const auto& data : data_) {
76 variance_sum += (data - average_.value()) * (data - average_.value());
77 }
78 variance_ = variance_sum / data_.size();
79
80 // 標準偏差を求める.
81 standard_deviation_ = sqrt(variance_.value());
82 }
83
86 std::optional<T> GetAverage() const { return average_; }
87
90 std::optional<T> GetVariance() const { return variance_; }
91
94 std::optional<T> GetStandardDeviation() const { return standard_deviation_; }
95
98 size_t GetDataNum() const { return data_.size(); }
99
102 std::optional<T> GetSum() const { return sum_; }
103
104 private:
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_;
110};
111
112} // namespace designlab
113
114#endif // DESIGNLAB_AVERAGE_CALCULATOR_H_
平均値,分散,標準偏差を求めるテンプレートクラス.
std::optional< T > GetVariance() const
分散を取得する.
void Calculate()
平均値,分散,標準偏差を計算する.
std::optional< T > GetSum() const
データの合計を取得する.
void Clear()
データをクリアする.
size_t GetDataNum() const
データ数を取得する.
std::optional< T > GetAverage() const
平均値を取得する.
std::optional< T > GetStandardDeviation() const
標準偏差を取得する.
void AddData(const T &data, const bool do_calc=true)
データを追加する. この関数を呼び出すたびに,平均値,分散,標準偏差が再計算される.
Definition com_type.h:21