【问题标题】:How to correctly set a random number generator?如何正确设置随机数生成器?
【发布时间】:2012-12-03 14:18:09
【问题描述】:

为了开发粒子过滤算法的实现,我需要生成与要跟踪的对象相关的运动的假设:如果我设置了 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】:

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

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

    我相信这会生成正确的随机数,并且在英特尔处理器(386、486、奔腾)上使用 Microsoft C 编译时已经过测试。

    仅供参考,4.0 * atan(1.0) 产生的 PI 值比上述环境中的常数要好得多。

    【讨论】:

    • 如何使用你的代码返回的随机向量得到按正态分布分布的值?
    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多