2013-02-24 17 views

Odpowiedz

11

Nie ma wbudowanej funkcji implementującej numpy.allclose, ale można ją łatwo napisać samodzielnie, jeśli jest to naprawdę potrzebne. Jednak wolałbym sugerują użycie isMuchSmallerThan z wartością odniesienia:

(a-b).isMuchSmallerThan(ref) 

gdzie sędzią jest reprezentatywna niż zero problemu.

EDIT: dla odniesienia jest tu możliwa realizacja 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 może być użyty do bezwzględnego porównania, tj. (Ab) .isMuchSmallerThan (1.0, atol) jest równoważne np.allclose (a, b, 0.0, atol), aby naśladować np.allclose musimy zrobić coś takiego: (ab) .isMuchSmallerThan (1.0, atol) || a.isApprox (b, rtol). Mam rację? – DikobrAz

+4

Niezupełnie, ponieważ isMuchSmallerThan i isApprox są oparte na normie macierzy L2, a nie na elementarnych porównaniach (nieskończona norma). – ggael

0

Istnieje również funkcja isApprox który nie działa dla mnie. Po prostu używam (expect - res) .norm() < niewielka liczba.