2012-12-16 5 views
3

입자 필터 알고리즘을 구현하기 위해 추적 할 객체와 관련된 움직임에 대한 가설을 생성해야합니다. N 샘플을 설정하고 2x1x 상태를 사용하면 벡터, 그럼 각 단계에서 N 임의의 값 쌍 (2 x N 행렬)을 생성해야합니다. 또한 운동 통계 (평균 및 표준 편차)를 알고있는 경우 평균 및 표준 편차를 사용하여 모든 N 값을 생성 할 수 있습니다. 마지막으로, 움직임의 불확실성을 모델링하기 위해 노이즈 매트릭스 (2 x N 행렬)를 생성하여 이동 행렬에 추가 할 수있었습니다.난수 생성기를 올바르게 설정하는 방법은 무엇입니까?

이러한 전제를 기반으로 matlab에서 실행되는 알고리즘을 구현했으며 다음과 같은 코드를 사용하여 이동의 가설을 생성했습니다. 위의 MATLAB 코드가 좋은 예측 (이 잘 작동), 대신 C로 작성된 동일한 코드는 ++ (코드 참조를 생성하면서, 실질적으로 : 나는 C++과 OpenCV의를 사용하여 동일한 알고리즘을 구현했을 때

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 

는 문제가 발생했습니다 아래)는 열악한 예측 (즉, 대상으로부터 멀리 떨어진 곳)을 생성합니다. 왜?

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 C를 사용하여 컴파일 할 때 죽음에 테스트되었습니다.

FYI, 4.0 * atan (1.0)은 위의 환경에서 상수보다 PI의 값이 훨씬 더 큽니다.

+0

코드에서 반환 한 임의의 벡터를 사용하여 정규 분포에 따라 값을 분산하는 방법은 무엇입니까? – enzom83

관련 문제