gpt4 book ai didi

c++ - boost multi_array View

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:57 25 4
gpt4 key购买 nike

我有一个 3 维 boost::multi_array 表示 2d tilemaps 层。我希望能够清除一层——也就是遍历一层上的所有图 block 并将其值设置为 0,但我不知道该怎么做——我相信我必须使用 View ,但文档没有”对我来说没有多大意义。例如,在查看此示例代码时:

// 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 是如何工作的?这些范围甚至代表什么?抱歉,如果这对某些人来说很明显,我只是无法掌握它。

提前致谢,嗯。

最佳答案

该示例创建了一个 3D View ,它访问了一个更大的 3D 数组的一部分,它有点复杂,因为它们在有界的同时展示了跨步 View 。

如果他们使用[range(0,2)][range(1,3)][range(0,4)]会更容易理解实体 3D block (沿第一维 0..2,沿第二维 1..3,沿第三维 0..4)

您的目标是 2D View (切片),所以让我们看一下,我会简化它:

您有一个 3x3x3 数组,您想要将通过其中心的平面归零。共有三个这样的平面,所以让我们为这三个平面中的每一个创建一个 2D View :

#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] ];

现在打印立方体..你会得到它的!

关于c++ - boost multi_array View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com