25 #include "libmesh/statistics.h"
26 #include "libmesh/int_range.h"
27 #include "libmesh/libmesh_logging.h"
40 const dof_id_type n = cast_int<dof_id_type>(this->size());
42 normsq += ((*
this)[i] * (*
this)[i]);
51 LOG_SCOPE (
"minimum()",
"StatisticsVector");
53 const T min = *(std::min_element(this->begin(), this->
end()));
64 LOG_SCOPE (
"maximum()",
"StatisticsVector");
66 const T max = *(std::max_element(this->begin(), this->
end()));
77 LOG_SCOPE (
"mean()",
"StatisticsVector");
79 const dof_id_type n = cast_int<dof_id_type>(this->size());
85 the_mean += ( static_cast<Real>((*
this)[i]) - the_mean ) /
86 static_cast<Real>(i + 1);
98 const dof_id_type n = cast_int<dof_id_type>(this->size());
103 LOG_SCOPE (
"median()",
"StatisticsVector");
105 std::sort(this->begin(), this->
end());
115 the_median = static_cast<Real>((*
this)[lhs]);
120 the_median = ( static_cast<Real>((*
this)[lhs]) +
121 static_cast<Real>((*
this)[rhs]) ) / 2.0;
130 template <
typename T>
141 template <
typename T>
144 const dof_id_type n = cast_int<dof_id_type>(this->size());
146 LOG_SCOPE (
"variance()",
"StatisticsVector");
148 Real the_variance = 0;
152 const Real delta = ( static_cast<Real>((*
this)[i]) - mean_in );
153 the_variance += (delta * delta - the_variance) /
154 static_cast<Real>(i + 1);
158 the_variance *= static_cast<Real>(n) / static_cast<Real>(n - 1);
164 template <
typename T>
167 const dof_id_type n = cast_int<dof_id_type>(this->size());
168 const Real max = this->maximum();
171 (*
this)[i] = static_cast<T>((*
this)[i] / max);
178 template <
typename T>
185 const dof_id_type n = cast_int<dof_id_type>(this->size());
187 std::sort(this->begin(), this->
end());
191 Real min = static_cast<Real>(this->minimum());
192 Real max = static_cast<Real>(this->maximum());
193 Real bin_size = (max - min) / static_cast<Real>(n_bins);
195 LOG_SCOPE (
"histogram()",
"StatisticsVector");
197 std::vector<Real> bin_bounds(n_bins+1);
199 bin_bounds[i] = min +
Real(i) * bin_size;
204 bin_bounds.back() += 1.e-6 * bin_size;
207 bin_members.resize(n_bins);
217 Real current_val = static_cast<Real>( (*
this)[i] );
222 if (current_val < min)
231 if (current_val > bin_bounds[j+1])
251 const dof_id_type n_binned = std::accumulate(bin_members.begin(),
253 static_cast<dof_id_type>(0),
254 std::plus<dof_id_type>());
258 libMesh::out <<
"Warning: The number of binned entries, n_binned="
260 <<
", did not match the total number of entries, n="
261 << n <<
"." << std::endl;
270 template <
typename T>
272 const std::string & filename,
276 std::vector<dof_id_type> bin_members;
277 this->histogram(bin_members, n_bins);
280 T min = this->minimum();
281 T max = this->maximum();
282 T bin_size = (max - min) / static_cast<T>(n_bins);
287 std::ofstream out_stream (filename.c_str());
289 out_stream <<
"clear all\n";
290 out_stream <<
"clf\n";
297 out_stream << min + (
Real(i)+0.5)*bin_size <<
" ";
299 out_stream <<
"];\n";
302 for (
auto bmi : bin_members)
304 out_stream << bmi <<
" ";
306 out_stream <<
"];\n";
307 out_stream <<
"bar(x,y);\n";
313 template <
typename T>
315 unsigned int n_bins)
const
319 return sv.
histogram(bin_members, n_bins);
325 template <
typename T>
328 LOG_SCOPE (
"cut_below()",
"StatisticsVector");
330 const dof_id_type n = cast_int<dof_id_type>(this->size());
332 std::vector<dof_id_type> cut_indices;
333 cut_indices.reserve(n/2);
337 if ((*
this)[i] < cut)
339 cut_indices.push_back(i);
349 template <
typename T>
352 LOG_SCOPE (
"cut_above()",
"StatisticsVector");
354 const dof_id_type n = cast_int<dof_id_type>(this->size());
356 std::vector<dof_id_type> cut_indices;
357 cut_indices.reserve(n/2);
360 if ((*
this)[i] > cut)
361 cut_indices.push_back(i);
373 #ifdef LIBMESH_DEFAULT_TRIPLE_PRECISION
376 #ifdef LIBMESH_DEFAULT_QUADRUPLE_PRECISION