提升multi_array观看次数

Boost multi_array Views

本文关键字:array multi 提升      更新时间:2023-10-16

我有一个三维boost::multi_array,代表二维瓦片地图的图层。我希望能够清除一个图层 - 也就是遍历一层上的所有瓷砖并将其值设置为 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如何工作? 这些范围甚至代表什么?抱歉,如果这对某些人来说很明显,我只是无法掌握它。

提前谢谢,嗯。

该示例创建一个 3D 视图,该视图访问较大 3D 数组的一部分,这有点复杂,因为它们在显示有界视图的同时显示跨步视图。

如果他们使用 [range(0,2)][range(1,3)][range(0,4)] 会更容易理解,这将切出一个实心 3D 块(沿第一维 0..2,沿第二维 1..3,沿第三维 0..4(

您的目标是 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] ];

并立即打印立方体..你会明白的!