2014-11-03 136 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 2014-11-03 22:18:25

+0

如果你想返回某些数据的第n百分位数,那么这个['prctile']就有一个函数。(http://www.mathworks.com/help/stats/prctile.html) – Amro 2014-11-03 22:20:54

+0

@Amro:也许他没有统计工具箱,或者不希望样本间插值。 – 2014-11-03 22:22:18

回答

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的[nth_element](http://www.cplusplus.com/reference/algorithm/nth_element/) – Amro 2014-11-03 22:22:56

+0

@本Voigt可以请解释一下为什么sort比qsort更好 – Gilad 2014-11-03 22:23:56

+0

@Amro:好点,因为他只需要一个结果。如果你想要,例如第一四分位数,中位数和第三四分位数,也可能完成排序。 – 2014-11-03 22:24:10