Templates -- Meow  204.13.18
A C++ template contains kinds of interesting classes and functions
utility.h
Go to the documentation of this file.
1 #ifndef math_utility_H__
2 #define math_utility_H__
3 
4 #include <cstdlib>
5 #include <vector>
6 #include <algorithm>
7 #include <cmath>
8 
9 namespace meow {
10 
12 static const double PI = 3.14159265358979323846264338327950288;
13 
17 template<class T>
18 inline T noEPS(T value, T eps = 1e-9) {
19  T epsp((eps < T(0)) ? -eps : eps);
20  return ((value < -epsp || value > epsp) ? value : T(0));
21 }
22 
26 template<class T>
27 inline T normalize(T lower, T upper, T value) {
28  return (value - lower) / (upper - lower);
29 }
30 
34 template<class T>
35 inline T denormalize(T lower, T upper, T _ratio) {
36  return lower + _ratio * (upper - lower);
37 }
38 
42 template<class T>
43 inline T ratioMapping(T l1, T u1, T m1, T l2, T u2) {
44  return denormalize(l2, u2, normalize(l1, u1, m1));
45 }
46 
50 template<class T>
51 inline T inRange(T const& mn, T const& mx, T const& v) {
52  return std::min(mx, std::max(mn, v));
53 }
54 
58 template<class T>
59 inline T isInRange(T const& mn, T const& mx, T const& x) {
60  return (mn <= x && x <= mx);
61 }
62 
66 template<class T>
67 inline T squ(T const& x) {
68  return x * x;
69 }
70 
74 template<class T>
75 inline T cub(T const& x) {
76  return x * x * x;
77 }
78 
82 template<class T>
83 inline double average(T const& beg, T const& end, double sigs) {
84  int N = 0;
85  double av = 0;
86  for (T it = beg; it != end; ++it, ++N) {
87  av += *it;
88  }
89  av /= N;
90  double sig = 0;
91  for (T it = beg; it != end; ++it) {
92  sig += (*it - av) * (*it - av);
93  }
94  sig = sqrt(sig / N);
95  double lower = av - sig * sigs, upper = av + sig * sigs;
96  double ret = 0, retn = 0;
97  for (T it = beg; it != end; ++it) {
98  if (lower <= *it && *it <= upper) {
99  ret += *it;
100  retn++;
101  }
102  }
103  return ret / retn;
104 }
105 
109 template<class T>
110 inline double average(T const& beg, T const& end, T const& p, double sigs) {
111  int N = 0;
112  double ps = 0;
113  for (T it = beg, ip = p; it != end; ++it, ++N, ++ip) {
114  ps += *ip;
115  }
116  double av = 0;
117  for (T it = beg, ip = p; it != end; ++it, ++ip) {
118  av += *it * *ip / ps;
119  }
120  double sig = 0;
121  for (T it = beg, ip = p; it != end; ++it, ++ip) {
122  sig += *ip / ps * (*it - av) * (*it - av);
123  }
124  sig = sqrt(sig);
125  double lower = av - sig * sigs, upper = av + sig * sigs;
126  double ret = 0, retn = 0;
127  for (T it = beg, ip = p; it != end; ++it, ++ip) {
128  if (lower <= *it && *it <= upper) {
129  ret += *it * *ip;
130  retn += *ip;
131  }
132  }
133  if (retn <= 1e-10) return av;
134  return ret / retn;
135 }
136 
140 template<class T>
141 inline T tAbs(T const& t) {
142  return (t < 0 ? -t : t);
143 }
144 
145 } // meow
146 
147 #endif // math_utility_H__
T normalize(T lower, T upper, T value)
(value-lower)/(upper-lower)
Definition: utility.h:27
T isInRange(T const &mn, T const &mx, T const &x)
(mn <= x && x <= mx)
Definition: utility.h:59
T ratioMapping(T l1, T u1, T m1, T l2, T u2)
denormalize(l2,u2,normalize(l1,u1,m1))
Definition: utility.h:43
T denormalize(T lower, T upper, T _ratio)
(lower+_ratio*(upper-lower))
Definition: utility.h:35
T noEPS(T value, T eps=1e-9)
如果abs(輸入的數值) < eps, 則回傳0, 否則回傳輸入的數值
Definition: utility.h:18
double average(T const &beg, T const &end, double sigs)
只將 sigs 個標準差以內的數據拿來取平均
Definition: utility.h:83
T tAbs(T const &t)
就只是個取絕對值
Definition: utility.h:141
T inRange(T const &mn, T const &mx, T const &v)
std::min(mx,std::max(mn,v))
Definition: utility.h:51
T cub(T const &x)
x*x*x
Definition: utility.h:75
static const double PI
圓周率...
Definition: utility.h:12
T squ(T const &x)
x*x
Definition: utility.h:67