我有一个3维boost::multi_array
代表2d tilemaps的图层。我希望能够清除一个图层 - 也就是遍历一层上的所有图块并将其值设置为0,但我无法弄清楚如何做到这一点 - 我相信我必须使用视图,但文档并没有对我来说很有意义。例如,在查看此示例代码时:
// myarray = 2 x 3 x 4
//
// array_view dims: [base,bound) (dimension striding default = 1)
// dim 0: [0,2)
// dim 1: [1,3)
// dim 2: [0,4) (strided by 2),
//
typedef boost::multi_array_types::index_range range;
// OR typedef array_type::index_range range;
array_type::array_view<3>::type myview = myarray[ boost::indices[range(0,2)][range(1,3)][range(0,4,2)] ];
for (array_type::index i = 0; i != 2; ++i)
for (array_type::index j = 0; j != 2; ++j)
for (array_type::index k = 0; k != 2; ++k)
assert(myview[i][j][k] == myarray[i][j+1][k*2]);
boost::indices
如何运作?这些范围甚至代表什么?对不起,如果对某些人来说这是显而易见的,我就无法理解它。
先谢谢,等等。
答案 0 :(得分:6)
该示例创建了一个3D视图,可以访问较大的3D数组的一部分,并且它有点复杂,因为它们在有界的同时显示跨步视图。
更容易理解他们是否使用了[range(0,2)][range(1,3)][range(0,4)]
,它会切出一个坚固的3D块(第一维为0..2,第二维为1..3,沿着0 ...第三个)
你的目标是2D视图(切片),所以让我们看一下,我会简单的说明:
你有一个3x3x3阵列,你想要将一个穿过它的中心的平面归零。有三个这样的平面,所以让我们为这三个平面创建一个2D视图:
#include <iostream>
#include <iomanip>
#include <boost/multi_array.hpp>
int main()
{
typedef boost::multi_array<int, 3> array_t;
array_t a(boost::extents[3][3][3]); // 3D array of 3x3x3
int values = 0;
for(array_t::index i = 0; i != 3; ++i)
for(array_t::index j = 0; j != 3; ++j)
for(array_t::index k = 0; k != 3; ++k)
a[i][j][k] = values++;
for(array_t::index i = 0; i != 3; ++i) {
for(array_t::index j = 0; j != 3; ++j) {
for(array_t::index k = 0; k != 3; ++k)
std::cout << std::setw(2) << a[i][j][k] << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
到目前为止一切都那么好..现在让我们剪掉一些2D飞机:
typedef boost::multi_array_types::index_range range_t;
array_t::index_gen indices;
// 2D plane that's constant in the 1st dimension
array_t::array_view<2>::type plane =
a[ indices[1][range_t(0,3)][range_t(0,3)] ];
for (array_t::index i = 0; i != 3; ++i)
for (array_t::index j = 0; j != 3; ++j)
plane[i][j] = 0;
现在尝试打印这个立方体,你会看到三个平面中的一个被归零。
然后用
替换plane
的初始值设定项
a[ indices[range_t(0,3)][1][range_t(0,3)] ];
和
a[ indices[range_t(0,3)][range_t(0,3)][1] ];
现在打印立方体..你会明白的!