【问题标题】:Wrong answer in Normal Distribution in CC中正态分布的错误答案
【发布时间】:2013-11-24 00:30:43
【问题描述】:

我使用此链接中给出的方程应用了正态分布函数: http://en.wikipedia.org/wiki/Normal_distribution

我为正态分布编写了这段代码

float m=2.0;
float s=0.5;
float x[3]={1.0, 2.0, 3.0};
float xs[3];
const float pi = 3.141;

for (int i=0; i<3; i++)
{
    xs[i]=(1/s*sqrt(2*pi))*exp(-(pow(x[i]-m,2)/2*pow(s,2)));
    printf("\n%f",xs[i]);
}

此代码的答案是 4.42、5.01、4.42

我在 Matlab 中有相同的代码

x_s_new=[1 2 3];
x_s=2+0.5.*randn(1,9);
x_s=x_s_new+0.5.*randn(1,3);
plot(x_s_new)

但是 matlab 中的答案是 0.8 , 1.9 , 3.7

谁能告诉我哪里出错了?

我想使用 C 应用正态分布

谢谢:)

【问题讨论】:

  • pi 近似值可能会更好....使用 math.h 中的值
  • randn 不是正态分布的 CDF 或 PDF,它是一个随机数生成器!检查normpdfnormcdf
  • 开始转换代码之前。你应该清理你的matlab代码。 x_s=2+0.5.*randn(1,9);的目的是什么?

标签: c matlab


【解决方案1】:

您的 Matlab 代码与您的 C 代码不同。 C 代码计算正态分布在某些点的概率密度函数的值。 Matlab 代码根据正态分布生成随机数。

C代码对应的Matlab代码为

m = 2;
s = 0.5;
x = [1 2 3];

for i = 1 : 3
    xs(i) = (1/s*sqrt(2*pi)) * exp(-( (x(i)-m)^2/2*s^2));
    fprintf('%f\n',xs(i));
end

并给出相同的结果

4.424183
5.013257
4.424183

但是,有一个错误,因为 / 在 Matlab 和 C 中只适用于紧邻的下一个操作数。正确的应该是

xs(i) = 1/(s*sqrt(2*pi)) * exp(-( (x(i)-m)^2/(2*s^2)));

相应地在 C 中。

要将使用randn 的代码翻译成C - 据我所知,C 中没有标准函数可以生成正态分布的随机数,您需要找到包含此类函数的库,或者从@ 开始自己构建它987654326@.

【讨论】:

  • 在 C 中实现此代码的任何想法,它产生与 Matlab 相同的结果,因为我想将此 matlab 代码转换为 C。
  • @user2828488:你真的需要完全相同的随机过程吗?这需要获取 matlab 随机生成器(可用)的 C 代码,设置相同的种子,以与 TMW 相同的方式实现 randn。
  • 是的,我想要将 matlab 代码转换为 C 所需的相同随机过程,而 C 不支持 randn 函数。你能在这里分享那个方法吗?
  • 检查 edit rand 以获取有关 matlab 使用的随机数生成器的信息。
  • 我想你在说这个 'r = a + (b-a).*rand(100,1);'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2017-05-21
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多