Có một hàm trong Eigen để so sánh các vec-tơ (ma trận) sử dụng cả dung sai tương đối và tuyệt đối hay còn gọi là numpy.allclose? Tiêu chuẩn isApprox không thành công nếu một trong các vectơ rất gần bằng không.Làm thế nào để so sánh vectơ xấp xỉ trong Eigen?
Trả lời
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();
}
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
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
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ỏ.
Xem http://eigen.tuxfamily.org/dox-2.0/TutorialCore.html – user1929959