2013-02-24 3 views
9

Есть ли функция в Eigen для сравнения векторов (матриц) с использованием как относительного, так и абсолютного допуска aka numpy.allclose? Стандарт isApprox терпит неудачу, если один из векторов очень близок к нулю.Как сравнить векторы примерно в Eigen?

+0

См. Http://eigen.tuxfamily.org/dox-2.0/TutorialCore.html – user1929959

ответ

11

Нет встроенной функции, реализующей numpy.allclose, но вы легко можете написать ее самостоятельно, если это действительно то, что вам нужно. Тем не менее, я предпочел бы предложить использование isMuchSmallerThan с эталонным значением:

(a-b).isMuchSmallerThan(ref) 

где исх является представителем ненулевым для вашей проблемы.

EDIT: для справки здесь является возможная реализация 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 можно использовать для абсолютного сравнения, то есть (ab) .isMuchSmallerThan (1.0, atol) эквивалентно np.allclose (a, b, 0.0, atol), поэтому для имитации np.allclose нам нужно сделать что-то вроде этого: (ab) .isMuchSmallerThan (1.0, atol) || a.isApprox (b, rtol). Я прав? – DikobrAz

+4

Не совсем потому, что isMuchSmallerThan и isApprox основаны на матричной норме L2, а не на элементарных сравнениях (бесконечная норма). – ggael

0

Существует также функция isApprox, которая не работает для меня. Я просто использую (ожидаем - res) .norm() < несколько небольшое количество.

Смежные вопросы