2012-02-12 30 views
2

我有一个3维的boost::multi_array代表2d瓷砖地图层。我希望能够清除一层 - 又名迭代所有瓷砖并将其值设置为0,但我无法弄清楚如何做到这一点 - 我相信我必须使用视图,但文档不会'对我来说很有意义。例如,在查看此示例代码时:Boost multi_array Views

// 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如何工作?这些范围甚至代表什么?对不起,如果这是显而易见的,我只是无法得到它的窍门。

在此先感谢,ell。

回答

6

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

尝试打印这个立方体现在,你会看到三架飞机中的一架被归零。

然后用

a[ indices[range_t(0,3)][1][range_t(0,3)] ]; 

a[ indices[range_t(0,3)][range_t(0,3)][1] ]; 

更换为plane初始化并打印方块现在..你会得到它!

+0

是否有内置的方式来提取子数组的副本?也就是说,不是使用相同数据的视图,而是实际复制数据,而无需手动迭代视图的相应索引和新的multi_array? – 2016-02-22 14:45:44

相关问题