это мой вызов функции
int gr_tperctile = tprctile(channel_gr, sizeOfChannel, 0.2);
это функция, которую я написал
int Detection::tprctile(int* gr, int sizeOfChannel, double pt)
{
qsort(gr,sizeOfChannel, sizeof(int),compare);
int ptInd = floor( (pt/100 * sizeOfChannel ) +0.5);
return gr[ptInd];
}
int compare(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
это исходный вызов функции
toolbox.c3d.p.tprctile(Gr(:),0.2)
это оригинальная функция
function val = tprctile(data, pt)
data = sort(data);
ptInd = round( pt/100 * length(data) );
val = data(ptInd);
Я не уверен в моей реализации и проверил ее на ограниченном числе примеров. может ли кто-нибудь сказать мне, если это правильно? или лучший способ реализовать Matlab
Если у вас есть C++ (и от использования вами классов, как вы это четко понимаете), почему вы используете медленную, небезопасную функцию qsort
. Вместо этого попробуйте:
std::sort(gr, gr+sizeOfChannel);
который заменяет все
qsort(gr,sizeOfChannel, sizeof(int),compare);
int compare(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
И я упоминал об этом быстрее? Это потому, что сравнение встраивается.
Как указывает Амро, вы также можете использовать
std::nth_element(gr, gr+ptInd, gr+sizeOfChannel);
который еще быстрее.
prctile