这是一个提升示例:
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]等索引创建视图?有什么想法吗?
答案 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管理索引的方式进行一些修改。