Преобразование кода в Matlab в C ++

это мой вызов функции

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

0

Решение

Если у вас есть 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);

что еще быстрее.

1

Другие решения


По вопросам рекламы [email protected]