boost :: multi_array中的随机访问视图

时间:2010-04-29 13:07:24

标签: c++ boost

这是一个提升示例:

  typedef boost::multi_array<double, 1> array_type;
  typedef array_type::index index;
  array_type A(boost::extents[100]);

  for(index i = 0; i != A.size(); ++i) {
        A[i] = (double)i;
  }

  // creating view
  array_type::index_gen indices;
  typedef boost::multi_array_types::index_range range;

  array_type::array_view<1>::type myview = A[ indices[range(0,50)] ];

此代码的作用是创建一个子数组或视图映射到原始数组。此视图是连续的,涵盖原始数组的第0到第50个元素。

如果我需要明确定义我想在视图中看到的元素,该怎么办?如何使用[1,5,35,23]等索引创建视图?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

除了在代码中引入间接代码之外,我认为你不能做任何事情,例如a [b [i]]其中b [i]包含[1,5,35,23]之类的内容。 AFAIK,MultiArray概念需要定义明确,持续不断的步伐。

答案 1 :(得分:0)

看起来很不错。我不认为Boost.MultiArray支持这一点,但在Boost ML上请求它可能是一个好主意。

我们可以考虑定义一个可变参数函数枚举,而不是使用生成index_range的范围,该枚举函数枚举给出了索引映射的范围(共域)

枚举(1,5,35,23)将映射到(0,1,2,3)

您的观点可以声明为

array_type :: index_gen indices; typedef boost :: multi_array_types :: index_enumeration_map enumeration; //请注意,index_enumeration_map不是MultiArray的一部分

array_type :: array_view&lt; 1&gt; :: type myview = A [indices [enumeration(1,5,35,23)];

当然,这需要对MultiArray管理索引的方式进行一些修改。