2013-02-24 9 views

risposta

11

Non è presente alcuna funzione incorporata che implementa numpy.allclose, ma è possibile scriverne uno autonomamente se è davvero ciò di cui si ha bisogno. Tuttavia, preferisco suggerire l'uso di isMuchSmallerThan con valore di riferimento:

(a-b).isMuchSmallerThan(ref) 

dove ref è un non nulla rappresentativo per il tuo problema.

EDIT: per riferimento qui è una possibile implementazione di tuttoChiudi:

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 può essere utilizzato per il confronto assoluto, cioè (ab) .isMuchSmallerThan (1.0, atol) è equivalente a np.allclose (a, b, 0.0, atol), quindi per simulare np.allclose dobbiamo fare qualcosa del genere: (ab) .isMuchSmallerThan (1.0, atol) || a.isApprox (b, rtol). Ho ragione? – DikobrAz

+4

Non esattamente perché isMuchSmallerThan e isApprox si basano sulla norma della matrice L2 e non sul confronto tra elementi (norma infinita). – ggael

0

C'è anche la funzione isApprox che non funzionava per me. Sto usando solo (expect - res) .norm() < un numero piccolo.