2013-02-24 6 views

Antwort

11

Es gibt keine eingebaute Funktion, die numpy.allclose implementiert, aber Sie können leicht selbst einen schreiben, wenn Sie das wirklich brauchen. Allerdings würde ich eher die Verwendung von isMuchSmallerThan mit Referenzwert vorschlagen:

(a-b).isMuchSmallerThan(ref) 

wo ref eine repräsentative nicht Null für Ihr Problem.

EDIT: Referenz hier ist eine mögliche Implementierung von 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 kann für absoluten Vergleich verwendet werden, dh (ab) .isMuchSmallerThan (1.0, atol) ist äquivalent zu np.allclose (a, b, 0.0, atol), um np.allclose nachzuahmen, müssen wir so etwas tun: (ab) .isMuchSmallerThan (1.0, atol) || a.isApprox (b, rtol). Hab ich recht? – DikobrAz

+4

Nicht genau, weil isMuchSmallerThan und isApprox auf der L2-Matrix-Norm und nicht elementweise Vergleiche (unendliche Norm) basieren. – ggael

0

Es gibt auch isApprox Funktion, die für mich nicht funktioniert. Ich verwende nur (expect - res) .norm() < einige kleine Zahl.