Существует ли assert_approx_eq для ndarray?

#multidimensional-array #rust

#многомерный массив #Ржавчина

Вопрос:

Я имею в виду ящик ndarray, а также assert_approx_eq.

Мой вопрос: существует ли что-то подобное assert_approx_eq для ndarray::Array2 etc.?

В настоящее время я делаю:

 for it in mat_a.iter().zip(expect_mat_a.iter()) {
  let (af, bf) = it;
  assert_approx_eq!(af, bf);
}
  

Это работает, но неоптимально.

Ответ №1:

Мой вопрос: существует ли что-то подобное assert_approx_eq для ndarray::Array2 etc.?

Не думаю, что это довольно специфично и ndarray , похоже, не дает ничего подобного.

 for it in mat_a.iter().zip(expect_mat_a.iter()) {
     let (af, bf) = it;
     assert_approx_eq!(af, bf);
}
  

Вы должны быть в состоянии немного упростить это, деконструировав кортеж прямо в итерации:

 for (af, bf) in mat_a.iter().zip(expect_mat_a.iter()) {
  assert_approx_eq!(af, bf);
}
  

Это работает, но неоптимально.

Синтаксически? Вы можете скрыть реализацию за собственным макрокомандой. Это, по сути, то, что assert_approx_eq делает, в этом нет ничего волшебного, он просто предоставляет удобства / удобные значения по умолчанию, в основном в том смысле, что он генерирует выразительное сообщение об ошибке при сбое, если вы посмотрите на код assert_approx_eq!($a, $b) , который просто описывает:

         let eps = 1.0e-6;
        let (a, b) = (amp;$a, amp;$b);
        assert!(
            (*a - *b).abs() < eps,
            "assertion failed: `(left !== right)` 
             (left: `{:?}`, right: `{:?}`, expect diff: `{:?}`, real diff: `{:?}`)",
            *a,
            *b,
            eps,
            (*a - *b).abs()
        );
  

Ответ №2:

Да, у ndarray есть дополнительная функция approx , и при ее включении он поддерживает approx свойства и макросы ящиков.

 use approx::assert_abs_diff_eq;

assert_abs_diff_eq!(af, bf);