8#ifndef META_OCEAN_BASE_MEDIAN_H
9#define META_OCEAN_BASE_MEDIAN_H
34 static inline T
median2(
const T& v0,
const T& v1);
46 static inline T
median3(
const T& v0,
const T& v1,
const T& v2);
59 static inline T
median4(
const T& v0,
const T& v1,
const T& v2,
const T& v3);
73 static inline T
median5(
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4);
86 static T
median(T* values,
const size_t number);
99 static T
constMedian(
const T* values,
const size_t number);
109 template <
typename T>
119 template <
typename T>
126 return v0 < v1 ? v0 : v1;
358inline T
Median::median5(
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4)
1174template <
typename T>
1177 ocean_assert(values != 0 && number > 0);
1179 if (values ==
nullptr || number == 0)
1185 size_t high = number - 1;
1186 size_t median = (low + high) >> 1;
1188 size_t ll, hh, middle;
1199 if (high == low + 1)
1201 if (values[low] > values[high])
1203 std::swap(values[low], values[high]);
1209 middle = (low + high) / 2;
1211 if (values[middle] > values[high])
1213 std::swap(values[middle], values[high]);
1216 if (values[low] > values[high])
1218 std::swap(values[low], values[high]);
1221 if (values[middle] > values[low])
1223 std::swap(values[middle], values[low]);
1226 std::swap(values[middle], values[low + 1]);
1233 while (ll < number && values[low] > values[++ll])
1238 while (hh > 0 && values[--hh] > values[low])
1248 std::swap(values[ll], values[hh]);
1251 std::swap(values[low], values[hh]);
1265template <
typename T>
1268 ocean_assert(values !=
nullptr && number > 0);
1280 Memory memory = Memory::create<T>(number);
1282 if (memory.
data() ==
nullptr)
1284 ocean_assert(
false &&
"Out of memory");
1288 memcpy(memory.
data<T>(), values,
sizeof(T) * number);
1289 const T result =
median(memory.
data<T>(), number);
1294template <
typename T>
1297 ocean_assert(values !=
nullptr && number > 0);
1310 const size_t index = std::max(
size_t(0), std::min(
size_t(
double(number) *
percentile),
size_t(number - 1)));
1311 ocean_assert(index < number);
1313 std::nth_element(values, values + index, values + number);
1315 return values[index];
1318template <
typename T>
1321 ocean_assert(values !=
nullptr && number > 0);
1334 Memory memory = Memory::create<T>(number);
1336 if (memory.
data() ==
nullptr)
1338 ocean_assert(
false &&
"Out of memory");
1342 memcpy(memory.
data<T>(), values,
sizeof(T) * number);
1344 return Median::percentile<T>(memory.
data<T>(), number,
percentile);
This class implements an object able to allocate memory.
Definition base/Memory.h:22
void * data()
Returns the pointer to the writable memory which is allocated by this object.
Definition base/Memory.h:303
The namespace covering the entire Ocean framework.
Definition Accessor.h:15