2013-02-24 57 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()<一些小數字。