2013-02-24 94 views

Trả lời

11

Không có chức năng cài đặt sẵn trong thực hiện numpy.allclose, nhưng bạn dễ dàng tự viết cho mình nếu đó thực sự là những gì bạn cần. Tuy nhiên, tôi muốn đề xuất sử dụng số isMuchSmallerThan với giá trị tham chiếu:

(a-b).isMuchSmallerThan(ref) 

trong đó ref là đại diện khác cho vấn đề của bạn.

EDIT: để tham khảo ở đây là một thực thể của 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 có thể được sử dụng để so sánh tuyệt đối, tức là (ab) .isMuchSmallerThan (1.0, atol) tương đương với np.allclose (a, b, 0,0, atol), do đó, để bắt chước np.allclose chúng ta phải làm một cái gì đó như thế này: (ab) .isMuchSmallerThan (1.0, atol) || a.isApprox (b, rtol). Tôi có đúng không? – DikobrAz

+4

Không chính xác vì isMuchSmallerThan và isApprox được dựa trên chuẩn mực ma trận L2 và không so sánh yếu tố khôn ngoan (định mức vô hạn). – ggael

0

Ngoài ra còn có isApprox chức năng mà không được làm việc cho tôi. Tôi chỉ sử dụng (mong đợi - res) .norm() < một số số nhỏ.