Eigen を使用している皆さん、こんにちは。ここで奇妙な質問に遭遇しました。
Eigenを使用して Unscented Kalman Filter を実装しました。
私の PC では非常にうまく動作しますが、同じコードが私の組み込みシステムOdroid XU (Armv7 アーキテクチャ) でセグメンテーション エラーを生成します。
何時間ものデバッグの後、問題は次の部分にあることがわかりました。
qrSolver.compute(OS.transpose());
m_q=qrSolver.householderQ();
m_r = qrSolver.matrixQR().triangularView<Upper>();
S_pre = m_r.block(0,0,n,n).transpose();
if (w_c0 < 0)
internal::llt_inplace<float,Upper>::rankUpdate(S_pre,
sqrt(-w_c0)*(sigmaPoints.col(0) - state_pre),
-1);
else
internal::llt_inplace<float,Upper>::rankUpdate(S_pre,
sqrt(w_c0)*(sigmaPoints.col(0) - state_pre),
1);
ここで、最初に行列OS (次元 n x 3n) の QR 分解を計算し、次にその R コンポーネント (次元 n x n) のランク更新を実行します。internal::llt_inplace::rankUpdateは、文書化されていない Eigen ライブラリの関数です。最初の引数に対してランク 1 の更新を実行するだけです。この関数は ~/path_to_Eigen/Cholesky/LLT.h にあります。
このコードの最も奇妙な点は、-DCMAKE_BUILD_TYPE=Debugを使用すると完全に動作しますが、 -DCMAKE_BUILD_TYPE=Releaseを使用してコンパイルすると、このコードは失敗します。
誰かがこれを理解できるか、以前に同様の問題を抱えているかどうかを尋ねたいと思います。助けてください、どうもありがとう。