特征代码在发布模式下失败,但在调试模式下工作

时间:2014-04-07 05:13:29

标签: c++ eigen eigen3 odroid

大家好使用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 进行编译,则此代码将失败

我想问一下,任何人都可以理解这一点,或者之前是否有人有过类似的问题。请帮助,非常感谢。

0 个答案:

没有答案