This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/math/MovingMedian.h
FrankE 382a046df1 new walker (control+path)
added new sanity checks
fixed minor errors
added corresponding test-cases
added moving-median
2016-02-05 20:18:48 +01:00

66 lines
1.1 KiB
C++

#ifndef MOVINGMEDIAN_H
#define MOVINGMEDIAN_H
#include <vector>
#include <algorithm>
template <typename T> class MovingMedian {
private:
/** up to "size" elements */
std::vector<T> values;
/** the number of elements to find the median within */
int size;
public:
/** ctor */
MovingMedian(const int size) : size(size) {;}
/** add a new value */
void add(const T val) {
// add new value
values.push_back(val);
// too many values?
if ((int) values.size() > size) {
values.erase(values.begin());
}
}
/** get the current median */
T get() const {
// create a sorted copy (slow, but works)
std::vector<T> copy = values;
std::sort(copy.begin(), copy.end());
// get the median
if (values.size() % 2 != 0) {
return values[(values.size() + 0) / 2];
} else {
return (values[values.size() / 2 - 1] + values[values.size() / 2 + 0]) / 2;
}
}
/** get the number of used entries */
int getNumUsed() const {
return (int) values.size();
}
/** get number of entries to get the median for */
int getSize() const {
return size;
}
};
#endif // MOVINGMEDIAN_H