2013-02-24 56 views

回答

11

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

(a-b).isMuchSmallerThan(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(); 
} 
+0

isMuchSmallerThan可用于绝对比较,即(ab).isMuchSmallerThan(1.0,atol)等价于np.allclose(a, b,0.0,atol),所以模仿np.allclose我们必须做这样的事情:(ab).isMuchSmallerThan(1.0,atol)|| a.isApprox(b,rtol)。我对么? – DikobrAz 2013-02-24 13:38:38

+4

不完全是因为isMuchStylerThan和isApprox是基于L2矩阵范数而不是基于元素的比较(无限范数)。 – ggael 2013-02-24 16:46:39

0

还有这不是为我工作isApprox功能。 我只是使用(expect-res).norm()<一些小数字。