7 # include <mln/util/array.hh>
15 template<
typename T >
18 bool operator() (
const T& lhs,
30 template<
typename T >
35 : mean_needs_update_(
false), median_needs_update_(
false),
36 variance_needs_update_(
false), std_needs_update_(
false), size_(0)
41 : mean_needs_update_(
false), median_needs_update_(
false),
42 variance_needs_update_(
false), std_needs_update_(
false), size_(0)
49 std::vector< T >&
data = data_.hook_std_vector_();
67 else if (value > max_)
78 if (mean_needs_update_)
84 for (
unsigned i = 0; i < size_; ++i)
89 mean_needs_update_ =
false;
97 if (median_needs_update_)
103 std::vector< T >&
data = data_.hook_std_vector_();
106 median_ = data[(size_ - 1) >> 1];
109 median_needs_update_ =
false;
117 if (variance_needs_update_)
124 for (
unsigned i = 0; i < size_; ++i)
126 const T tmp = mean_ - data_[i];
128 variance_ += (tmp * tmp);
132 std_ =
sqrt(variance_);
135 variance_needs_update_ =
false;
136 std_needs_update_ =
false;
142 T standard_deviation()
144 if (std_needs_update_)
150 T min() {
return (size_ > 0) ? min_ : 0; }
151 T max() {
return (size_ > 0) ? max_ : 0; }
155 std::vector< T >&
data = data_.hook_std_vector_();
159 unsigned nelements() {
return size_; }
161 T operator[] (
const unsigned index)
169 mean_needs_update_ =
true;
170 median_needs_update_ =
true;
171 variance_needs_update_ =
true;
172 std_needs_update_ =
true;
176 bool mean_needs_update_ : 1;
177 bool median_needs_update_ : 1;
178 bool variance_needs_update_ : 1;
179 bool std_needs_update_ : 1;
187 util::array< T > data_;
194 template<
typename T >
199 : clusters_need_update_(
true), data_sorted_(
false)
203 stats(
const int size)
204 : clusters_need_update_(
true), data_sorted_(
false), data_(size)
211 std::vector< cluster_stats< T > >& clusters = clusters_.hook_std_vector_();
213 data_sorted_ =
false;
214 clusters_need_update_ =
true;
220 clusters_need_update_ =
true;
230 return data_.median();
235 return data_.variance();
238 T standard_deviation()
240 return data_.standard_deviation();
243 T min() {
return data_.min(); }
244 T max() {
return data_.max(); }
246 unsigned nelements() {
return data_.nelements(); }
248 util::array< cluster_stats< T > >& clusters()
250 if (clusters_need_update_)
253 clusters_need_update_ =
false;
260 void compute_clusters()
262 std::vector< unsigned > clusters;
263 unsigned cluster_index = 1;
265 clusters.reserve(data_.nelements());
267 if (not data_sorted_)
274 const unsigned nelements = data_.nelements();
276 clusters.push_back(cluster_index);
277 const T std = data_.standard_deviation();
279 for (i = 1; i < nelements - 1; ++i)
281 const T left_distance = data_[i] - data_[i - 1];
282 const T right_distance = data_[i + 1] - data_[i];
284 if (not ((left_distance <= 1 || left_distance < right_distance)
285 && left_distance <= std))
288 clusters.push_back(cluster_index);
293 if (data_[i] - data_[i - 1] > std)
295 clusters.push_back(cluster_index);
299 clusters_.reserve(cluster_index);
303 while (i < nelements)
307 while (tmp < nelements && clusters[tmp] == clusters[i])
313 while (tmp < nelements && clusters[tmp] == clusters[i])
315 cluster.take(data_[tmp]);
319 clusters_.append(cluster);
327 bool clusters_need_update_ : 1;
328 bool data_sorted_ : 1;
330 util::array< cluster_stats< T > > clusters_;