Здесь я создаю тензор 1 на 1. Я пытаюсь получить доступ и установить число в (1,0) и (0,1), которые находятся вне индексов диапазона.Я ожидаю получить ошибку утверждения или исключения.
Eigen::Tensor<int,2> data(1,1);
auto n1 = data(1,0);
data(0,1) = 1;
Но все работает нормально.Но если я пытаюсь сделать то же самое с матрицей той же формы, я получаю ошибку подтверждения, как и ожидалось.
Eigen::Matrix<int,1,1> matrix;
auto n2 = matrix(1,0); // Signal: SIGABRT (Aborted)
matrix(0,1) = 1; // same error here
Проверяя заголовки Eigen, я вижу, что реализация тензора проверяет такие индексы какэто (хотя я понятия не имею, как это работает):
bool checkIndexRange(const array<Index, NumIndices>& indices) const
{
// ...
return
// check whether the indices are all >= 0
array_apply_and_reduce<logical_and_op, greater_equal_zero_op>(indices) &&
// check whether the indices fit in the dimensions
array_zip_and_reduce<logical_and_op, lesser_op>(indices, m_storage.dimensions());
// m_storage.dimensions() evaluates to {1,1}
}
Реализация матрицы проверяет индексы с помощью этого кода:
eigen_assert(row >= 0 && row < rows()
&& col >= 0 && col < cols());
Я проверил документацию Eigen здесь но это ничего не говорит о поведении вне диапазона.Мой вопрос: почему я не получаю ошибку подтверждения вне диапазона, когда я получаю доступ к номерам вне диапазона в тензоре?
Редактировать: Моя версия Eigen - 3.3.90