Чтобы разработать мою реализацию алгоритма фильтра частиц, мне нужно сгенерировать гипотезы о движениях, относящихся к отслеживаемому объекту: если я установлю 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?
Я думаю, что просто по счастливой случайности ответил на ваш вопрос здесь или, по крайней мере, предложил альтернативное решение.
https://stackoverflow.com/a/13897938/1899861
Я полагаю, что это сгенерирует правильные случайные числа и было проверено до смерти при компиляции с использованием Microsoft C на процессорах Intel (386, 486, Pentium).
К вашему сведению, 4,0 * atan (1,0) дает гораздо лучшее значение PI, чем константа в вышеуказанной среде.
Других решений пока нет …