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
15
16namespace designlab
17{
18
22template <typename T, typename = std::enable_if_t<std::is_arithmetic<T>::value>>
24{
25public:
27 data_(),
28 sum_(std::nullopt),
29 average_(std::nullopt),
30 variance_(std::nullopt),
31 standard_deviation_(std::nullopt)
32 {
33 }
34
39 void AddData(const T& data, const bool do_calc = true)
40 {
41 data_.push_back(data);
42
43 if (sum_.has_value())
44 {
45 sum_ = sum_.value() + data;
46 }
47 else
48 {
49 sum_ = data;
50 }
51
52 if (do_calc)
53 {
54 Calculate();
55 }
56 }
57
60 void Clear()
61 {
62 data_.clear();
63 sum_ = std::nullopt;
64 average_ = std::nullopt;
65 variance_ = std::nullopt;
66 standard_deviation_ = std::nullopt;
67 }
68
70 void Calculate()
71 {
72 // データが空の場合は,平均値,分散,標準偏差を nullopt にする.
73 if (data_.empty())
74 {
75 average_ = std::nullopt;
76 variance_ = std::nullopt;
77 standard_deviation_ = std::nullopt;
78 return;
79 }
80
81 // 平均値を求める.
82 average_ = sum_.value() / data_.size();
83
84 // 分散を求める.
85 T variance_sum = 0;
86
87 for (const auto& data : data_)
88 {
89 variance_sum += (data - average_.value()) * (data - average_.value());
90 }
91 variance_ = variance_sum / data_.size();
92
93 // 標準偏差を求める.
94 standard_deviation_ = sqrt(variance_.value());
95 }
96
99 std::optional<T> GetAverage() const
100 {
101 return average_;
102 }
103
106 std::optional<T> GetVariance() const
107 {
108 return variance_;
109 }
110
113 std::optional<T> GetStandardDeviation() const
114 {
115 return standard_deviation_;
116 }
117
120 size_t GetDataNum() const
121 {
122 return data_.size();
123 }
124
127 std::optional<T> GetSum() const
128 {
129 return sum_;
130 }
131
132private:
133 std::vector<T> data_;
134 std::optional<T> sum_;
135 std::optional<T> average_;
136 std::optional<T> variance_;
137 std::optional<T> standard_deviation_;
138};
139
140} // namespace designlab
141
142
143#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:24