std::nth_element
次のように、ベクトルのパーセンタイルの (ほぼ正しい) 値を取得するために使用しています。
double percentile(std::vector<double> &vectorIn, double percent)
{
std::nth_element(vectorIn.begin(), vectorIn.begin() + (percent*vectorIn.size())/100, vectorIn.end());
return vectorIn[(percent*vectorIn.size())/100];
}
最大 32 要素の長さの vectorIn の場合、ベクトルが完全にソートされることに気付きました。33 要素から始まると、(予想どおり) ソートされません。
これが問題かどうかはわかりませんが、関数は「(Matlab-)mex c++ コード」にあり、「Microsoft Windows SDK 7.1 (C++)」を使用して Matlab 経由でコンパイルされます。
編集:
関数に渡された 1e5 ベクトル内の最長のソート済みブロックの長さの次のヒストグラムも参照してください (ベクトルには 1e4 のランダム要素が含まれ、ランダムなパーセンタイルが計算されました)。非常に小さい値でのピークに注意してください。