Matlab - 累积分布函数(CDF)

时间:2012-06-04 15:16:50

标签: c++ matlab optimization boost

我正处于从Matlab到C ++的代码转换过程中,出于某些重要原因,我必须获得“正常”函数(在matlab中,'norm')的累积分布函数,其中mean = 0和variance = 1。

Matlab中的实现是这样的:

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

这应该是map.c中直方图的均衡。

问题来自于将其转换为C ++,因为我缺少小数。我尝试了很多典型的cdf实现:比如我在这里找到的C ++代码, Cumulative Normal Distribution Function in C/C++但是我得到了一个重要的小数位,所以我尝试了boost实现:

#include "boost/math/distributions.hpp" 

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

但它仍然与Matlab的实现不一样(我想它似乎更精确!)

有谁知道我在哪里可以找到这个过程的原始Matlab源,或者我应该考虑的正确的小数位数?

提前致谢!

3 个答案:

答案 0 :(得分:1)

Octave 是一个开源的Matlab克隆。以下是Octave实施normcdfhttp://octave-nan.sourcearchive.com/documentation/1.0.6/normcdf_8m-source.html

的源代码

它应该(几乎)与Matlab相同,如果它对你有所帮助。

答案 1 :(得分:1)

高斯CDF是一个有趣的功能。我不知道我的回答是否会引起你的兴趣,但是很可能会引起其他人的兴趣,这些人会在以后查找你的问题,所以就在这里。

可以通过按术语整合PDF术语的泰勒级数来计算CDF。这种方法在高斯钟形曲线的主体中运行良好,只有它在尾部数值上失败。在尾巴中,它需要特殊功能技术。我读到的最好的来源是N. N. Lebedev的Special Functions and Their Applications,Ch。 2,多佛,1972年。

答案 2 :(得分:0)

C和C ++支持long double以获得更精确的浮点类型。您可以尝试在实现中使用它。您可以检查编译器文档以查看它是否提供更高精度的浮点类型。 GCC 4.3及更高版本提供__float128,其精度更高。