Gibt es in Eigen eine Funktion zum Vergleichen von Vektoren (Matrizen) unter Verwendung sowohl relativer als auch absoluter Toleranz (numpy.allclose)? Standard isApprox schlägt fehl, wenn einer der Vektoren sehr nahe bei Null ist.Wie Vektoren ungefähr in Eigen zu vergleichen?
Antwort
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();
}
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
Nicht genau, weil isMuchSmallerThan und isApprox auf der L2-Matrix-Norm und nicht elementweise Vergleiche (unendliche Norm) basieren. – ggael
Es gibt auch isApprox Funktion, die für mich nicht funktioniert. Ich verwende nur (expect - res) .norm() < einige kleine Zahl.
Siehe http://eigen.tuxfamily.org/dox-2.0/TutorialCore.html – user1929959