2012-06-04 315 views
1

我處於從Matlab到C++的代碼轉換過程中,出於一些重要的原因,我必須獲得'正常'函數的累積分佈函數(在matlab中,'norm '),均值= 0,色散= 1。Matlab - 累積分佈函數(CDF)

在Matlab中的實現是這樣的:

map.c = cdf('norm', map.c, 0,1); 

這是假設是從map.c.直方圖均衡化

由於缺少小數位,因此將問題轉換爲C++時會出現問題。我嘗試了很多典型的CDF實現:如C++代碼,我發現在這裏, Cumulative Normal Distribution Function in C/C++但我得到了一個重要的缺乏小數的,所以我試圖升壓實現:

#include "boost/math/distributions.hpp" 

boost::math::normal_distribution<> d(0,1); 

,但它畢竟是不一樣的作爲Matlab的實現(我想它似乎更加精確!)

有沒有人知道我可以找到原始的Matlab來源爲這樣一個過程,或者哪個是我應該考慮的小數的正確數量?

在此先感謝!

+0

如果助推劑更精確,對你來說不是更好嗎? – Shahbaz

+0

事情是,我已經有一些結果與我應該競選的這種Matlab的CDF,所以我應該使用相同的算法...... :( – Ciller

+0

「缺少小數」是一個不精確的短語。雙精度浮點數是這是MATLAB使用的標準精度,與C++中使用'double'類型的精度相同。什麼結果讓你說你有一個精度問題?是否有可能沒有足夠精度地打印它們,導致你相信沒有足夠的內部精度? – Peter

回答

0

對於更精確的浮點類型,C和C++支持long double。你可以嘗試在你的實現中使用它。您可以檢查您的編譯器文檔以查看它是否提供了更高精度的浮點類型。 GCC 4.3及更高版本提供更精確的__float128

1

高斯CDF是一個有趣的功能。我不知道我的答案是否會讓你感興趣,但是可能會讓其他人在後面看到你的問題感興趣,所以在這裏。

可以通過整合PDF術語的泰勒級數來計算CDF。這種方法在高斯鐘形曲線的主體中運作良好,只有在尾部數字化失敗。在尾巴中,它需要特殊功能技巧。我讀過的最好的資料是N. N. Lebedev的Special Functions and Their Applications,Ch。 2,Dover,1972.