Czy istnieje funkcja Eigen do porównywania wektorów (macierzy) przy użyciu tolerancji względnej i bezwzględnej aka numpy.allclose? Standard isApprox kończy się niepowodzeniem, jeśli jeden z wektorów jest bardzo bliski zeru.Jak porównać wektory w przybliżeniu w Eigen?
Odpowiedz
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();
}
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
Niezupełnie, ponieważ isMuchSmallerThan i isApprox są oparte na normie macierzy L2, a nie na elementarnych porównaniach (nieskończona norma). – ggael
Istnieje również funkcja isApprox który nie działa dla mnie. Po prostu używam (expect - res) .norm() < niewielka liczba.
Zobacz http://eigen.tuxfamily.org/dox-2.0/TutorialCore.html – user1929959