Esiste una funzione in Eigen per confrontare i vettori (matrici) utilizzando sia la tolleranza relativa sia quella assoluta, ovvero numpy.allclose? Lo standard isApprox non riesce se uno dei vettori è molto vicino allo zero.Come confrontare i vettori approssimativamente in Eigen?
risposta
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();
}
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
Non esattamente perché isMuchSmallerThan e isApprox si basano sulla norma della matrice L2 e non sul confronto tra elementi (norma infinita). – ggael
C'è anche la funzione isApprox che non funzionava per me. Sto usando solo (expect - res) .norm() < un numero piccolo.
Vedi http://eigen.tuxfamily.org/dox-2.0/TutorialCore.html – user1929959