2012-02-12 57 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

相關問題