2012-12-16 43 views
3

爲了開發我的粒子濾波器算法實現,我需要生成關於與要跟蹤的對象有關的運動的假設:如果我設置了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中實現的算法一樣?

回答

2

我想我只是偶然地在這裏回答你的問題,或者至少提供了一個替代解決方案。

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

我相信,這將產生適當的隨機數,和英特爾處理器(386,486,奔騰)使用Microsoftç編譯時已經過測試死亡。

FYI,4.0 * ATAN(1.0)得到的PI比上述環境的恆定好得多的值。

+0

如何使用代碼返回的隨機向量根據正態分佈獲取分佈值? – enzom83