如何正确设置随机数生成器?

问题描述 投票:3回答:1

为了开发我的粒子滤波算法的实现,我需要生成关于与要跟踪的对象相关的运动的假设:如果我设置N个样本并且如果我使用2×1状态向量,那么在每个步骤我必须生成N对随机值(2乘N矩阵)。此外,如果我知道运动的统计数据(平均值和标准差),那么我可以使用均值和标准差来生成所有N值。最后,为了模拟运动的不确定性,我可以生成一个噪声矩阵(一个2乘N矩阵)并将其添加到运动矩阵中。

基于这些前提,我已经实现了在matlab中运行的算法,并且我使用以下代码来生成运动的假设。

ds_mean = [dx_mean dy_mean];
ds_stddev = [dx_stddev dy_stddev];
d = 5;

V = zeros(2,N);
V(1,:) = normrnd(ds_mean(1),ds_stddev(1),1,N);   % hypotheses of movement on x axis
V(2,:) = normrnd(ds_mean(2),ds_stddev(2),1,N);   % hypotheses of movement on y axis

E = d*randn(2,N);   % weighted noise

M = V + E;   % hypotheses of movement

当我不得不使用C ++和OpenCV实现相同的算法时出现问题:基本上,虽然上面的matlab代码生成了良好的预测(它工作得很好),但是用C ++编写的相同代码(参见下面的代码)会产生很差的预测(即远离物体)。为什么?

RNG m_rng;

x_mean = // ...
y_mean = // ...
x_stddev = // ...
y_stddev = // ...

Mat velocity(STATE_DIM, NUM_PARTICLES, DataType<double>::type);
m_rng.fill(velocity.row(0), RNG::NORMAL, x_mean, x_stddev);
m_rng.fill(velocity.row(1), RNG::NORMAL, y_mean, y_stddev);

Mat noise(STATE_DIM, NUM_PARTICLES, DataType<double>::type);
m_rng.fill(noise,RNG::NORMAL,0,1);
noise *= d;   % weighted noise

movements = velocity + noise;

如何确保C ++算法与matlab中实现的算法一样有效?

c++ c matlab opencv particle-filter
1个回答
2
投票

我想我在这里只是偶然回答了你的问题,或者至少提供了另一种解决方案。

https://stackoverflow.com/a/13897938/1899861

我相信这会生成适当的随机数,并且在英特尔处理器(386,486,Pentium)上使用Microsoft C进行编译时已经过测试。

FYI,4.0 * atan(1.0)产生的PI值远高于上述环境中的常数。

© www.soinside.com 2019 - 2024. All rights reserved.