为什么Eigen::Tensor的多维矩阵的第一个索引能够遍历张量的所有成员?
Why the first index of a multidimensional matrix of Eigen::Tensor able to loop through all the members of the tensor?
为什么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
截至今天,访问 Eigen::Tensor
的超出范围元素的行为没有记录。但是您实际上可以让它在使用 -DEIGEN_INTERNAL_DEBUGGING
编译时生成断言(但是,这会使执行速度显着变慢)。
Godbolt-演示:https://godbolt.org/z/RrnjXS
使用获取边界检查。但是您的问题中存在潜在的错误假设。张量只是 data[a*k + b*j + i]
访问的一块内存。因此,如果在不超过总大小的情况下,通过整个数组更改对 data[i]
但 运行 的访问,则不会获得任何核心 dump/uninitialized value/UB.
chtz answer 中的边界检查将断言第 i 个维度中的索引不超过该维度的大小,不张量的整个大小。因此,这是一个更严格的约束。
为什么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
截至今天,访问 Eigen::Tensor
的超出范围元素的行为没有记录。但是您实际上可以让它在使用 -DEIGEN_INTERNAL_DEBUGGING
编译时生成断言(但是,这会使执行速度显着变慢)。
Godbolt-演示:https://godbolt.org/z/RrnjXS
使用data[a*k + b*j + i]
访问的一块内存。因此,如果在不超过总大小的情况下,通过整个数组更改对 data[i]
但 运行 的访问,则不会获得任何核心 dump/uninitialized value/UB.
chtz answer 中的边界检查将断言第 i 个维度中的索引不超过该维度的大小,不张量的整个大小。因此,这是一个更严格的约束。