2012-02-07 80 views
4

我看過this post,它解決了如何循環使用boost::multi_array::origin()函數而不是基於零的數組,但只創建單個循環。Boost :: multi_array looping

一個人如何遍歷multi_array的每個維度,例如:

for(index i = <origin of dim 1>; ...) { 
    for(index j = <origin of dim 2>; ...) { 
     for(index k = <origin of dim 3>; ...) { 
     myArray[i][j][k] = <something>; 
     } 
    } 
} 

給出的陣列,其中上和下邊界是未知的時?

回答

5

index_bases成員函數返回一個包含每個維度的索引基的容器。成員函數shape返回一個包含每個維度的範圍(大小)的容器。您可以使用這兩種判斷指數的範圍爲每個維度:

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

void printArray(const array_type& a) 
{ 
    // Query extents of each array dimension 
    index iMin = a.index_bases()[0]; 
    index iMax = iMin + a.shape()[0] - 1; 
    index jMin = a.index_bases()[1]; 
    index jMax = jMin + a.shape()[1] - 1; 
    index kMin = a.index_bases()[2]; 
    index kMax = kMin + a.shape()[2] - 1; 

    for (index i=iMin; i<=iMax; ++i) 
    { 
     for (index j=jMin; j<=jMax; ++j) 
     { 
      for (index k=kMin; k<=kMax; ++k) 
      { 
       std::cout << a[i][j][k] << " "; 
      } 
     } 
    } 
} 

int main() 
{ 
    typedef array_type::extent_range range; 
    typedef array_type::index index; 
    array_type::extent_gen extents; 

    // Extents are hard-coded here, but can come from user/disk. 
    array_type a(extents[2][range(1,4)][range(-1,3)]); 

    // Populate array with values... 

    // Pass the array to a function. The function will query 
    // the extents of the given array. 
    print(a); 

    return 0; 
} 
+1

但這要求你知道你正在編寫代碼的時間數組的大小,失去了大部分的multi_array的泛型。 – 2016-04-07 19:29:52

+0

@DavidDoria,在'A(extents [2] [range(1,4)] [range(-1,3)])'中,你可以用你喜歡的任何東西替換硬編碼的維度值,來自磁盤或來自用戶的輸入。爲了簡化示例,我對數字進行了硬編碼。 – 2016-04-07 20:09:37

+0

重新排列示例以更好地說明如何在數組初始化之後查詢維度範圍。 – 2016-04-07 20:21:38

相關問題