Тензор не создает исключение для индекса вне диапазона - PullRequest
0 голосов
/ 13 июня 2018

Здесь я создаю тензор 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

1 Ответ

0 голосов
/ 13 июня 2018

Модуль Tensor, похоже, выполняет здесь только eigen_internal_assert вместо eigen_assert, как это делает модуль Core.Чтобы активировать внутренние утверждения, вам нужно скомпилировать с -DEIGEN_INTERNAL_DEBUGGING - это, вероятно, значительно замедлит Eigen, хотя (конечно, зависит от того, что вы делаете).

...