【发布时间】: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