1

我正在进行从 Matlab 到 C++ 的代码转换,出于某些重要原因,我必须获得均值 = 0 且方差 = 1 的“正态”函数(在 matlab 中为“范数”)的累积分布函数。

Matlab 中的实现是这样的:

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

这应该是来自 map.c 的直方图的均衡化。

由于我没有小数,问题出现在将其翻译成 C++ 的那一刻。我尝试了很多典型的 cdf 实现:例如我在这里找到的 C++ 代码 ,C/C++ 中的累积正态分布函数,但我严重缺乏小数,所以我尝试了 boost 实现:

#include "boost/math/distributions.hpp" 

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

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

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

提前致谢!

4

3 回答 3

1

Octave是一个开源的 Matlab 克隆。这是 Octave 实现的源代码:http normcdf: //octave-nan.sourcearchive.com/documentation/1.0.6/normcdf_8m-source.html

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

于 2012-06-04T15:36:45.740 回答
1

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

可以通过逐项积分 PDF 的泰勒级数来计算 CDF。这种方法在高斯钟形曲线的主体中效果很好,只是在尾部数字上失败了。在尾巴上,它需要特殊功能的技术。我读过的最好的资料是 NN Lebedev 的Special Functions and They Applications,Ch。2,多佛尔,1972 年。

于 2012-06-04T15:41:25.223 回答
0

C and C++ support long double for a more precise floating point type. You could try using that in your implementation. You can check your compiler documentation to see if it provides an even higher precision floating point type. GCC 4.3 and higher provide __float128 which has even more precision.

于 2012-06-04T15:26:37.293 回答