Почему первый индекс многомерной матрицы Eigen :: Tensor способен перебирать все члены тензора? - PullRequest
0 голосов
/ 31 октября 2019

Почему первый индекс многомерной матрицы Eigen :: Tensor способен успешно пройти через все члены тензора?

Я новичок в библиотеке Eigen :: Tensor и все еще тестирую ее, чтобы принять еедля моего кода.

#include <Eigen/CXX11/Tensor>

using namespace Eigen;

int main()
{
    Tensor<double, 3> t3d (2, 3, 4);
    t3d.setValues(
        {{{0, 6, 12, 18}, {2, 8, 14, 20}, {4, 10, 16, 22}},
         {{1, 7, 13, 19}, {3, 9, 15, 21}, {5, 11, 17, 23}}});
    for (int i = 0; i < t3d.size(); ++i)
    {
        cout << t3d(i, 0, 0) << '\t';
    }
}

Должно выдавать ошибку какого-либо типа (дамп памяти и т. д.) или доступ к неназначенным частям памяти для получения случайных значений. Удивительно, но правильно выводятся все члены тензора:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Используйте ответ chtz , чтобы получить проверку границ. Но в вашем вопросе есть ошибочное предположение. Тензор - это просто блок памяти, доступ к которому data[a*k + b*j + i]. Поэтому, если вы измените доступ на data[i], но выполните весь массив без превышения общего размера, вы не получите никакого дампа ядра / неинициализированного значения / UB.

Проверка границ в ответе chtzутверждают, что индекс в i-м измерении не превышает размер этого измерения, а , а не , всего размера тензора. Таким образом, это более жесткое ограничение.

1 голос
/ 31 октября 2019

На сегодняшний день поведение доступа к элементам вне диапазона Eigen::Tensor не задокументировано. Но вы можете сделать так, чтобы он генерировал утверждения при компиляции с -DEIGEN_INTERNAL_DEBUGGING (однако это может значительно замедлить выполнение).

Godbolt-Demo: https://godbolt.org/z/RrnjXS

...