#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);