爲了開發我的粒子濾波器算法實現,我需要生成關於與要跟蹤的對象有關的運動的假設:如果我設置了N樣本,並且如果我使用了2×1的狀態向量,那麼在每一步我必須生成N對的隨機值(一個2乘以N矩陣)。此外,如果我知道運動的統計數據(均值和標準差),那麼我可以使用均值和標準差來生成所有的N值。最後,爲了模擬運動的不確定性,我可以生成一個噪聲矩陣(矩陣),並將其添加到運動矩陣中。如何正確設置隨機數發生器?
基於這些前提,我已經實現了在MATLAB運行算法,我用下面的代碼,以便產生運動的假設。實質上,而上面的MATLAB代碼產生良好的預測(它的偉大工程),而不是用C語言編寫相同的代碼++(見代碼:
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來實現相同的算法出現問題下面)產生不良預測(即遠離對象)。爲什麼?
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中實現的算法一樣?
如何使用代碼返回的隨機向量根據正態分佈獲取分佈值? – enzom83