【问题标题】:Boost multi_array Views提升多数组视图
【发布时间】:2012-03-04 06:33:35
【问题描述】:

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

先谢谢了,嗯。

【问题讨论】:

    标签: c++ boost multidimensional-array


    【解决方案1】:

    该示例创建了一个 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] ];
    

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

    【讨论】:

    • 是否有内置方法来提取子数组的副本?也就是说,不是使用相同数据的视图,而是实际复制数据,而不需要手动迭代视图的相应索引和新的 multi_array?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多