ich nth_element bin mit einem (in etwa korrekt) Wert für eine Perzentil eines Vektors zu erhalten, etwa so:Warum gibt std :: nth_element sortierte Vektoren für Eingabevektoren mit N <33 Elementen zurück?
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];
}
bemerkte ich, dass für Vectorin Längen von bis zu 32 Elementen, wird der Vektor vollständig sortiert. Ausgehend von 33 Elementen wird es (wie erwartet) nie sortiert.
Nicht sicher, ob das wichtig ist, aber die Funktion ist in einem "(Matlab-) mex C++ - Code", der über Matlab mit dem "Microsoft Windows SDK 7.1 (C++)" kompiliert wird.
EDIT:
auch folgende Histogramms der Längen der längsten sortierten Blöcke in 1E5-Vektoren an die Funktion übergeben (siehe Vektoren enthalten 1E4 zufällige Elemente und ein zufälliges Perzentil wurde berechnet). Beachten Sie die Spitze bei sehr kleinen Werten.
Die Funktion führt eine teilweise Art, um den Wert zurück Ihnen angeforderte . Wie viel von einer partiellen Art es tut, hängt von der Implementierung ab. –
Nein, nicht Mex verwandte, aber coole Frage. – chappjc
Der Spike auf der linken Seite Ihres Diagramms ähnelt stark dem Histogramm der Länge der längsten konsekutiven Untersequenz in einem zufälligen Vektor. Dies könnte dem kleinen Bruchteil von zufällig ausgewählten Perzentilwerten entsprechen, der so nahe an einem Ende des Vektors liegt, dass die längste Teilfolge in dem Teil des Vektors liegt, der niemals von nth_vector berührt wird. Aber das ist nur eine Vermutung. – rici