查看文档后,我无法弄清楚这一点。

我可以写这样的代码

typedef boost::multi_array<boost::int32_t, 3> data_t;

// 3d --
typedef data_t::array_view<3>::type data_3d_view_t;

// 2d --
typedef data_3d_view_t::reference data_2d_subarray_t;
typedef data_t::array_view<2>::type data_2d_view_t;

然后,我可以使用data_2d_subarray_tdata_2d_view_t类型访问2d切片。

它们之间有什么区别?
我不能与另一个做些什么?
有性能差异吗?

非常感谢您向我澄清这一点。
最好的祝福,
Rodrigob。

最佳答案

MultiView associated types表:



因此,它们是不同的类型。在这种情况下, View 表示MultiArray的一种子集合。它们实现了MultiArray概念,但其中包含的元素实际上是其他MultiArray的元素。 View 允许您在MultiArray的元素中定义新的index。例如,您可以定义一个反转索引的 View ,以便该 View 的第一个元素是MultiArray的最后一个元素。从documentation:



MultiArray是递归定义的;可以将维度n> 1的MultiArray视为维度n-1的MultiArray的数组,它们是子数组。子数组和 View 之间的主要区别在于,您可以沿任意轴(包括主轴)将MultiArray切片为较低维度的 View ,但是不能沿主轴切片子数组。

data_t d3(boost::extents[4][5][6]);
data_2d_view_t d2_view = d3[boost::indices[range(0,4,2)][1][range(0,6,3)]];
data_2d_subarray_t d2_sub = d3[1];
// the following, and anything like it, won't work
data_2d_subarray_t d2_sub_b = d3[range(0,4,2)][0];

我不认为会有任何主要的性能差异,尽管这取决于您在创建 View 时使用哪种类型的索引。 View 的性能可能会稍差一些,但不是大意义上的。

10-07 19:27
查看更多