如何在Eigen中近似比较向量?

Dik*_*rAz 11 c++ linear-algebra eigen

在Eigen中是否存在使用相对和绝对容差(numpy.allclose)比较矢量(矩阵)的函数?如果其中一个向量非常接近零,则标准isApprox失败.

gga*_*ael 12

没有内置函数实现numpy.allclose,但如果你真正需要的话,你可以自己轻松编写一个.但是,我宁愿建议使用带参考值的isMuchSmallerThan:

(a-b).isMuchSmallerThan(ref)
Run Code Online (Sandbox Code Playgroud)

其中ref是您的问题的代表非零.

编辑:这里的参考是allclose的一个可能的实现:

template<typename DerivedA, typename DerivedB>
bool allclose(const Eigen::DenseBase<DerivedA>& a,
              const Eigen::DenseBase<DerivedB>& b,
              const typename DerivedA::RealScalar& rtol
                  = Eigen::NumTraits<typename DerivedA::RealScalar>::dummy_precision(),
              const typename DerivedA::RealScalar& atol
                  = Eigen::NumTraits<typename DerivedA::RealScalar>::epsilon())
{
  return ((a.derived() - b.derived()).array().abs()
          <= (atol + rtol * b.derived().array().abs())).all();
}
Run Code Online (Sandbox Code Playgroud)

  • 不完全是因为isMuchSmallerThan和isApprox是基于L2矩阵规范而不是基于元素的比较(无限规范). (4认同)

nnr*_*les 5

还有 isApprox 函数对我不起作用。我只是使用 (expect - res).norm() < 一些小数字。