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

0

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 );
}

MATLAB

это исходный вызов функции

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

  • 2
    при доступе к массиву данных у вас может возникнуть ошибка C ++ использует индексирование на основе 0, на основе MATLAB 1.
  • 0
    также, если вы хотите вернуть n-й процентиль некоторых данных, есть функция для этого prctile
Показать ещё 2 комментария
Теги:
percentile
porting

1 ответ

1
Лучший ответ

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

который еще быстрее.

  • 2
    в этом случае (процентили), возможно, просто используйте STL's nth_element
  • 0
    @Ben Voigt, пожалуйста, объясните немного, почему сортировка лучше, чем qsort.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню