大家好使用Eigen,我在这里遇到了一个奇怪的问题。
我使用Eigen实现了Unscented卡尔曼滤波器。
它在我的电脑上工作得非常好,但同一段代码会在我的嵌入式系统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 的QR分解(维数n-by-3n),然后执行其R分量的秩更新(维数n-by-n)。 internal :: llt_inplace :: rankUpdate 是特征库中的一个函数,未记录。它只对第一个参数执行rank-1更新。这个函数可以在〜/ path_to_Eigen / Cholesky / LLT.h
中找到这段代码中最奇怪的是,使用 -DCMAKE_BUILD_TYPE = Debug 它可以正常工作,而如果我使用 -DCMAKE_BUILD_TYPE = Release 进行编译,则此代码将失败
我想问一下,任何人都可以理解这一点,或者之前是否有人有过类似的问题。请帮助,非常感谢。