2016-02-29 112 views
0

我在嘗試從multi_array中提取子數組。對於這個演示,我們假設沒有摺疊維度(即子數組的維度與原始數組相同)。我認爲我正在用正確的請求擴展構建一個視圖(雖然很笨拙......),但是現在如何將數據從請求的索引(又稱爲視圖的所有索引)複製到子數組中?這裏是一個輪廓:從multi_array中提取子陣列

#include <boost/multi_array.hpp> 

const unsigned int Dimension = 3; 
using ArrayType = boost::multi_array<double, Dimension>; 
using IndexType = boost::array<ArrayType::index, Dimension>; 

ArrayType ExtractSubGrid(const ArrayType& array, const typename boost::detail::multi_array::index_gen<Dimension, Dimension>& indices) 
{ 
    typename ArrayType::template const_array_view<Dimension>::type view = array[indices]; 

    IndexType subArraySize; 
    for(size_t dim = 0 ; dim < Dimension; ++dim) { 
     subArraySize[dim] = indices.ranges_[dim].finish_ - indices.ranges_[dim].start_; 
    } 

    ArrayType subArray; 
    subArray.resize(subArraySize); 

    // How to do this? 
    //subArray.data() = view.data(); 

    return subArray; 
} 

int main() 
{ 
    ArrayType myArray(IndexType({{3,4,2}})); 

    boost::detail::multi_array::index_gen<3,3> indices = boost::indices[ArrayType::index_range(0,2)][ArrayType::index_range(1,3)][ArrayType::index_range(0,4)]; 

    ArrayType subGrid = ExtractSubGrid(myArray, indices); 

    return 0; 
} 
+0

我預計'子陣=視圖;'更邏輯接近預期的接口。沒時間現在通過 – sehe

+0

@seow哇,測試東西,編譯,而且正是我想要的。現在只需測試一下正確的數據就可以了。 –

回答

0

會是這樣的幫助:

std::copy(view.begin(), view.end(), subArray.begin()); 
+0

只要我們確定按照正確的順序複製索引,那會很好。我試圖通過填充一些數據來測試,但是看起來很像這樣簡單的錯誤:'unsigned int i = 0; (auto itr = myArray.begin(); itr!= myArray.end(); ++ itr){itr = data [i]; i ++; }'?它似乎沒有將'itr'解引用到一個可變的double? –

+0

這是因爲'const' ness? –

+0

我在循環中嘗試了'ArrayType :: iterator'而不是'auto',以確保它沒有獲得const迭代器,並且它仍然具有相同的編譯器錯誤。它們深入subarray.hpp('other'中成員num_dimensions的請求,它是非類類型'const double'等)。 –