【问题标题】:Matlab - Cumulative distribution function (CDF)Matlab - 累积分布函数(CDF)
【发布时间】:2012-06-08 16:02:45
【问题描述】:

我正在进行从 Matlab 到 C++ 的代码转换,出于某些重要原因,我必须获得均值 = 0 和方差的“正态”函数(在 matlab 中为“范数”)的累积分布函数=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 源代码,或者我应该考虑哪个小数位数正确?

提前致谢!

【问题讨论】:

  • 如果 boost 更精确,那不是更适合你吗?
  • 问题是,我已经用这种 Matlab 的 CDF 得到了一些结果,我应该使用它,所以我应该使用相同的算法...... :(
  • “缺少小数”是一个不精确的短语。双精度浮点数是 MATLAB 使用的标准精度,与您在 C++ 中使用 'double' 类型的精度相同。什么结果让您说您遇到了精度问题?是否有可能您打印的精度不够,导致您认为内部精度不够?
  • 也许我解释得不够清楚...我只需要在 C++ 中实现 Matlab 的普通 CDF。我尝试了提升正态分布,但我不知道为什么(可能也是因为 cdf 的错误表......)我没有得到与使用 Matlab 获得的结果相同的结果:D
  • 您引用的 SO 帖子让 cmets 说代码中的 pow 需要更改为霍纳的。是你做的吗?基本上w计算中的最后一个表达式可以改为((((a5 * K + a4) * K + a3) * K + a2) * K + a1) * K

标签: c++ matlab optimization boost


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-04-27
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 2022-11-06
        相关资源
        最近更新 更多