Here is the Quantile function, equivalent to MATLAB with linear interpolation:
template<typename T> static inline double Lerp(T v0, T v1, T t) { return (1 - t)*v0 + t*v1; } template<typename T> static inline std::vector<T> Quantile(const std::vector<T>& inData, const std::vector<T>& probs) { if (inData.empty()) { return std::vector<T>(); } if (1 == inData.size()) { return std::vector<T>(1, inData[0]); } std::vector<T> data = inData; std::sort(data.begin(), data.end()); std::vector<T> quantiles; for (size_t i = 0; i < probs.size(); ++i) { T poi = Lerp<T>(-0.5, data.size() - 0.5, probs[i]); size_t left = std::max(int64_t(std::floor(poi)), int64_t(0)); size_t right = std::min(int64_t(std::ceil(poi)), int64_t(data.size() - 1)); T datLeft = data.at(left); T datRight = data.at(right); T quantile = Lerp<T>(datLeft, datRight, poi - left); quantiles.push_back(quantile); } return quantiles; }
Find quartiles:
std::vector<double> in = { 1,2,3,4,5,6,7,8,9,10,11 }; auto quartiles = Quantile<double>(in, { 0.25, 0.5, 0.75 });
source share