簡體   English   中英

提高多數組視圖

[英]Boost multi_array Views

我有一個3維的boost::multi_array表示2d tilemap的圖層。 我希望能夠清除一層-也可以遍歷一層上的所有圖塊並將其值設置為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如何工作? 這些范圍甚至代表什么? 抱歉,如果這對某些人來說很明顯,我就無法理解。

預先感謝,ell。

該示例創建了一個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] ];

並立即打印多維數據集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM