2014-11-03 14 views
0

C++

это мой вызов функции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); 
} 

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. – Amro

+0

также, если вы хотите вернуть n-й процентиль некоторых данных, есть функция для этого ['prctile'] (http://www.mathworks.com/help/stats/prctile.html) – Amro

+0

@Amro: Возможно, у него нет панели инструментов статистики или не требуется интерполяция между образцами. –

ответ

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

И сделал я упоминаю это быстрее? Это потому, что сравнение встраивается.

Как Amro указывает, вы можете также использовать

std::nth_element(gr, gr+ptInd, gr+sizeOfChannel);

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

+2

в этом случае (процентили), может просто использовать [nth_element] STL (http://www.cplusplus.com/reference/algorithm/nth_element/) – Amro

+0

@Ben Voigt может объяснить немного, почему сортировка лучше, чем qsort – Gilad

+0

@Amro: Хороший момент, так как ему нужен только один результат. Если вы собираетесь, например, первый квартиль, медианный и третий квартиль, может также завершить сортировку. –