12

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

我可以编写代码,例如

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_t或访问二维切片data_2d_view_t

它们之间有什么区别?
我可以用一个做什么而我不能用另一个做什么?
是否有任何性能差异?

非常感谢您向我澄清这一点。最好的问候,罗德里戈布。

4

1 回答 1

5

MultiView 关联类型表中:

reference 这是包含值的引用类型。如果 NumDims == 1,那么这是 element&。否则,这与模板 subarray::type 的类型相同。

template array_view::type 这是具有 Dims 维度的视图类型。它由调用运算符返回。它对 MultiArray 进行建模。

所以它们是不同的类型,首先。在这种情况下,视图表示 MultiArray 的一种子集合。它们实现了 MultiArray 的概念,但它们包含的元素实际上是其他一些 MultiArray 的元素。视图允许您为MultiArray 的元素定义新索引。例如,您可以定义一个反转索引的视图,以便视图的第一个元素是 MultiArray 的最后一个元素。从文档中:

视图允许您将 MultiArray 中的底层元素的子集视为单独的 MultiArray。由于视图引用相同的底层元素,因此对视图元素所做的更改将反映在原始 MultiArray 中。

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

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

我不相信有任何重大的性能差异,但这取决于您在创建视图时使用的索引类型。视图的性能可能稍差一些,但不是大 O 意义上的。

于 2010-11-21T04:04:14.597 回答