2016-09-22 35 views
1

我有一個函數,需要創建一個boost多矩陣的維度是事先不知道。但是,對於任何給定的維度,範圍都是已知的。我如何增量地爲我的數組構建一個擴展盤區對象?如何動態設置維度的多元陣列

喜歡的東西:

array_type::extent_gen<array_type::dimensionality> my_extents; 
for (size_type d = 0; d < array_type::dimensionality; d++) { 
    extents = extents[5]; 
} 
array_type my_array(extents); 

會設置一個尚未確定的陣列具有在每個維度5的程度....

+0

'extents = extents [5];'?我不明白這應該是什麼 – user463035818

+1

想要得到一個類似於「範圍[5] [5] [5] ..... [5]」的東西,請參閱d 5s – Scott

+0

考慮添加/您想要的東西實現(不/如何/)這個問題。還要添加'array_type'的定義。 – sehe

回答

0

我不認爲你可以,因爲的multi_array維度進行編碼類型的模板參數:

typedef boost::multi_array<double, 3> array_type; 

是從根本上

不同
typedef boost::multi_array<double, 2> array_type; 

「最佳」,你可以做的是有

static const int MAX_DIMENSIONS = 10; 
typedef boost::multi_array<double, MAX_DIMENSIONS> array_type; 

,然後生成範圍離開 「未使用」 維度的程度上1

Live On Coliru

#include <boost/multi_array.hpp> 
#include <iostream> 

static const int MAX_DIMENSIONS = 5; 
typedef boost::multi_array<double, MAX_DIMENSIONS> array_type; 

array_type make_array(int dims, int default_extent = 5) { 
    boost::array<int, MAX_DIMENSIONS> exts = {}; 
    std::fill_n(exts.begin(), exts.size(), 1); 
    std::fill_n(exts.begin(), dims, default_extent); 

    return array_type(exts); 
} 

int main() { 
    auto a = make_array(3); 
    auto b = make_array(2); 

    std::copy(a.shape(), a.shape() + a.dimensionality, std::ostream_iterator<size_t>(std::cout << "\na: ", " ")); 
    std::copy(b.shape(), b.shape() + b.dimensionality, std::ostream_iterator<size_t>(std::cout << "\nb: ", " ")); 
} 

打印

a: 5 5 5 1 1 
b: 5 5 1 1 1 
+0

(注意,你可以隨後從該數組中獲得一個數組視圖,透明地隱藏未使用的維度,但是 - 再次 - 你將在那裏獲得不同的靜態類型) – sehe