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