2010-11-18 18 views
11

Sau khi tìm tài liệu, tôi không thể tìm ra tài liệu này.Sự khác biệt giữa tăng betwen :: lượt xem đa điểm và subarrays

tôi có thể viết mã như

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; 

Sau đó, tôi có thể truy cập vào một lát 2d sử dụng qua các loại data_2d_subarray_t hoặc data_2d_view_t.

Sự khác nhau giữa chúng là gì?
Tôi có thể làm gì với cái mà tôi không thể làm với cái kia?
Có sự khác biệt về hiệu suất nào không?

Cảm ơn rất nhiều vì đã làm rõ điều này với tôi. Trân trọng, rodrigob.

Trả lời

5

Từ bảng của MultiView associated types:

tham khảo Đây là loại tài liệu tham khảo giá trị kiềm chế. Nếu NumDims == 1, thì đây là phần tử &. Nếu không, đây là loại tương tự như mẫu subarray :: type.

mẫu array_view :: type Đây là loại chế độ xem có kích thước Dims. Nó được trả về bởi nhà điều hành gọi. Nó mô hình MultiArray.

vì vậy chúng là các loại khác nhau, để bắt đầu. Trong bối cảnh này, các khung nhìn biểu diễn một loại phần con của một MultiArray. Chúng thực hiện khái niệm MultiArray, nhưng các phần tử chúng chứa đựng thực sự là các phần tử của một số MultiArray khác. Chế độ xem cho phép bạn xác định index mới thành các phần tử của MultiArray. Ví dụ, bạn có thể định nghĩa một khung nhìn đảo ngược chỉ mục, sao cho phần tử đầu tiên của khung nhìn là phần tử cuối cùng của MultiArray. Từ số documentation:

Chế độ xem cho phép bạn xử lý tập hợp con các phần tử cơ bản trong MultiArray như thể nó là một MultiArray riêng biệt. Vì chế độ xem đề cập đến các yếu tố cơ bản giống nhau, các thay đổi được thực hiện cho các yếu tố của chế độ xem sẽ được phản ánh trong MultiArray gốc.

MultiArrays được định nghĩa đệ quy; một MultiArray của kích thước n> 1 có thể được coi là mảng của MultiArrays của kích thước n -1, đó là subarrays. Sự khác biệt chính giữa một subarray và view là bạn có thể cắt một MultiArray thành các khung nhìn có kích thước thấp hơn dọc theo bất kỳ trục nào, kể cả trục chính, nhưng các mảng con không thể được cắt dọc theo trục chính.

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

Tôi không tin rằng có bất kỳ khác biệt hiệu suất lớn nào, mặc dù điều này phụ thuộc vào loại chỉ mục bạn sử dụng khi tạo chế độ xem. Chế độ xem có thể kém hiệu quả hơn một chút, nhưng không có ý nghĩa lớn.

+0

Cảm ơn câu trả lời! Đó chính xác là những gì tôi đang tìm kiếm! Mặc dù dựa trên kinh nghiệm trước đây của tôi http://stackoverflow.com/questions/446866/boostmulti-array-performance-question/4220976#4220976 Tôi sẽ nghĩ rằng trong các phân số tổng quát có hiệu suất cao hơn nhiều so với lượt xem (trong một "k ở bên cạnh của ý nghĩa O lớn). – rodrigob

Các vấn đề liên quan