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的更好方法

最佳答案

如果您拥有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);

更快。

关于c++ - Matlab至C++代码转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26724231/

10-11 18:05