Просмотр произвольного доступа в boost :: multi_array - PullRequest
0 голосов
/ 29 апреля 2010

Вот пример повышения:

  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]? Есть идеи?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2010

Похоже, хорошая функция. Я не думаю, что Boost.MultiArray поддерживает это, но было бы неплохо запросить его на Boost ML.

Вместо использования диапазона, который генерирует index_range, мы могли бы подумать об определении перечисления переменной функции, которое дает диапазон (совмещенный домен) отображения для индекса

перечисление (1, 5, 35, 23) будет соответствовать (0,1,2,3)

Ваш взгляд может быть объявлен как

array_type :: index_gen indexices; typedef boost :: multi_array_types :: index_enumeration_map enumeration; // обратите внимание, что index_enumeration_map не является частью MultiArray

array_type :: array_view <1> :: type myview = A [indexes [enumeration (1, 5, 35, 23)];

Конечно, для управления индексами MultiArray потребуются некоторые изменения.

0 голосов
/ 29 апреля 2010

Я не думаю, что вы можете сделать что-либо, кроме введения косвенного в коде, например a [b [i]] где b [i] содержит такие вещи, как [1,5,35,23]. AFAIK, концепция MultiArray требует четко определенных, постоянных шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...