15#include <nk/value/value.hpp>
23 double min, max, mean, median, mode, var, std;
31inline bool computeValueStatsRange(
const Value &val, std::size_t start,
34 const std::size_t numel = val.numel();
35 if (start > numel) start = numel;
36 const std::size_t end =
37 (count > numel - start) ? numel : start + count;
38 std::vector<double> v;
39 v.reserve(end - start);
40 if (val.type() == ValueType::DOUBLE) {
41 const double *p = val.doubleData();
42 for (std::size_t i = start; i < end; ++i)
43 if (std::isfinite(p[i])) v.push_back(p[i]);
44 }
else if (val.type() == ValueType::LOGICAL) {
45 const std::uint8_t *p = val.logicalData();
46 for (std::size_t i = start; i < end; ++i) v.push_back(p[i] ? 1.0 : 0.0);
47 }
else if (val.type() == ValueType::COMPLEX) {
48 const Complex *p = val.complexData();
49 for (std::size_t i = start; i < end; ++i) {
50 double m = std::hypot(p[i].
real(), p[i].
imag());
51 if (std::isfinite(m)) v.push_back(m);
53 }
else if (isFloatType(val.type()) || isIntegerType(val.type())) {
57 for (std::size_t i = start; i < end; ++i) {
58 double x = val.elemAsDouble(i);
59 if (std::isfinite(x)) v.push_back(x);
64 const std::size_t n = v.size();
65 if (n == 0)
return false;
67 double sum = 0.0, mn = v[0], mx = v[0];
68 for (
double x : v) {
sum += x;
if (x < mn) mn = x;
if (x > mx) mx = x; }
69 s.min = mn; s.max = mx; s.mean =
sum /
static_cast<double>(n);
71 std::vector<double> sorted = v;
72 std::sort(sorted.begin(), sorted.end());
73 s.median = (n % 2) ? sorted[n / 2]
74 : 0.5 * (sorted[n / 2 - 1] + sorted[n / 2]);
77 for (
double x : v) {
double d = x - s.mean; acc += d * d; }
78 s.var = (n >= 2) ? acc /
static_cast<double>(n - 1) : 0.0;
79 s.std = std::sqrt(s.var);
83 double bestVal = sorted[0];
84 std::size_t bestCnt = 1, curCnt = 1;
85 for (std::size_t i = 1; i < n; ++i) {
86 curCnt = (sorted[i] == sorted[i - 1]) ? curCnt + 1 : 1;
87 if (curCnt > bestCnt) { bestCnt = curCnt; bestVal = sorted[i]; }
96 return computeValueStatsRange(val, 0, val.numel(), s);
Core MATLAB-compatible multidimensional array and scalar value type.
Value sum(const Value &x, std::pmr::memory_resource *mr=nullptr)
Sum of array elements along first non-singleton dimension (sum(x)).
Value imag(const Value &x, std::pmr::memory_resource *mr=nullptr)
Imaginary part of complex array (y = imag(x)).
Value real(const Value &x, std::pmr::memory_resource *mr=nullptr)
Real part of complex array (y = real(x)).