【问题标题】:Random access view in boost::multi_arrayboost::multi_array 中的随机访问视图
【发布时间】:2010-04-29 13:07:23
【问题描述】:

这是一个提升示例:

  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] 之类的索引创建视图?有什么想法吗?

【问题讨论】:

  • 您的问题是否仅限于一维的多数组?
  • 一点也不,只是用简单的例子来讨论概念性的事情要容易得多。一维对此有好处)在 boost::vector 或 boost::array 中是否有类似 view-approach 的东西?

标签: c++ boost


【解决方案1】:

除了在代码中引入间接性之外,我认为您无能为力,例如a[b[i]] 其中 b[i] 包含 [1,5,35,23] 之类的内容。 AFAIK,MultiArray 概念需要明确的、恒定的步幅。

【讨论】:

  • 是的,这是一个非常简单的解决方案,但它并不好。为什么我需要将所有这些开销的东西与 multy_arrays 一起使用,然后如果我要将它用作简单的 C 样式数组? :)
  • 很公平,但我不确定您打算如何创建一个 C 样式数组的视图,其中索引 {0,1,2,3} 访问偏移量 {1,5,35,23 } 也没有引入类似 a[b[i]] 的间接寻址。
【解决方案2】:

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

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

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

您的视图可以声明为

array_type::index_gen 索引; typedef boost::multi_array_types::index_enumeration_map 枚举; // 注意 index_enumeration_map 不是 MultiArray 的一部分

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

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多