2014-11-03 177 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