Boost::multi_array looping

Boost::multi_array looping

本文关键字:looping array multi Boost      更新时间:2023-10-16

我看过这篇文章,它介绍了如何使用boost::multi_array::origin()函数在非零基数组上循环,但只创建一个循环。

如何遍历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>;
      }
   }
}

当给定一个上界和下界都未知的数组时?

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;
}