我正处于从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源,或者我应该考虑的正确的小数位数?
提前致谢!
答案 0 :(得分:1)
Octave 是一个开源的Matlab克隆。以下是Octave实施normcdf
:http://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
,其精度更高。