В чем разница между boost :: multi_array views и subarrays - PullRequest
11 голосов
/ 19 ноября 2010

После просмотра документации я не могу понять это.

Я могу написать такой код, как

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;

Затем я могу получить доступ к 2-мерному слайсу, используя типы data_2d_subarray_t или data_2d_view_t.

В чем разница между ними?
Что я могу сделать с одним, что я не могу сделать с другим?
Есть ли разница в производительности?

Большое спасибо за разъяснение этого мне. С наилучшими пожеланиями, rodrigob.

1 Ответ

5 голосов
/ 21 ноября 2010

Из таблицы MultiView связанных типов :

reference Это ссылочный тип содержащегося значения.Если NumDims == 1, то это элемент &.В противном случае это тот же тип, что и у шаблона subarray :: type.

template array_view :: type Это тип представления с измерениями Dims.Возвращается вызывающим оператором.Он моделирует MultiArray.

, поэтому для начала это разные типы.В этом контексте представления представляют собой своего рода коллекцию MultiArray.Они реализуют концепцию MultiArray, но содержащиеся в них элементы фактически являются элементами некоторого другого MultiArray.Представления позволяют определить новый index для элементов MultiArray.Например, вы можете определить представление, которое переворачивает индекс, так что первый элемент представления является последним элементом MultiArray.Из документации :

Представление позволяет обрабатывать подмножество базовых элементов в MultiArray, как если бы это был отдельный MultiArray.Поскольку представление ссылается на те же базовые элементы, изменения, внесенные в элементы представления, будут отражены в исходном MultiArray.

MultiArrays определяются рекурсивно;MultiArray измерения n > 1 можно рассматривать как массив MultiArrays измерения n -1, которые являются подмассивами.Основное различие между подмассивом и представлением состоит в том, что вы можете нарезать MultiArray на представления более низких размеров вдоль любой оси, включая основную ось, но подмассивы нельзя разрезать вдоль главной оси.Не верьте, что есть существенное различие в производительности, хотя это зависит от того, какой тип индекса вы используете при создании представления.Представления могут быть немного менее производительными, но не в широком смысле.

...