3

粒子フィルター アルゴリズムの実装を開発するために、追跡するオブジェクトに関連する動きに関する仮説を生成する必要があります。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 に実装されたアルゴリズムと同様に機能することを確認するにはどうすればよいですか?

4

1 に答える 1

2

ここで偶然あなたの質問に答えたか、少なくとも別の解決策を提供したと思います。

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

これで適切な乱数が生成されると思います。Intel プロセッサ (386、486、Pentium) で Microsoft C を使用してコンパイルした場合は、完全にテストされています。

参考までに、4.0 * atan(1.0) は、上記の環境の定数よりもはるかに優れた PI の値を生成します。

于 2012-12-16T02:29:11.533 に答える