Boost.MultiArray Новичок: как получить 4D-массив с динамическими размерами внутреннего массива? - PullRequest
2 голосов
/ 29 октября 2010

Я хочу сохранить некую матрицу расстояний (2D), где каждая запись имеет несколько альтернатив (разные координаты).Так что я хочу получить доступ к расстоянию, например, x = 1 с x_alt = 3 и y = 3 с y_alt = 1, просматривая 4-мерный мульти-массив с массивом [1] [3] [3] [1].

Важно отметить следующее: два самых внутренних массива / вектора не имеют одинакового размера для разных значений внешних.

Послепервый шаг инициализации, где я вычисляю значения, больше не требуется никаких модификаций!

Это должно быть легко возможно при использовании stl-векторов:

vector<vector<vector<vector<double> > > >`extended_distance_matrix;

, где я могу динамически перебиратьвнешние 2 измерения и заполните только столько альтернатив внутренним 2 измерениям, сколько мне нужно (например, с помощью push_back ()).

Вопросы:

  • Естьтакое определение структуры данных возможно с Boost.MultiArray?Как?
  • Является ли хорошей идеей использовать Boost.MultiArray вместо вложенных векторов?Производительность (особенно поиски! (Memory-layout))Простота в использовании?

Спасибо за любой ввод!

sascha

PS: документация повышения не помогла мне.Может быть, можно использовать multi_array_ref, чтобы получить уже измеренные массивы во всю 4D-структуру?

Редактировать: В данный момент я думаю о другом подходе: сплющить альтернативы -> одну большую матрицусо всеми расстояниями между альтернативами.Затем мне нужно только рассчитать количество альтернатив на узел, построить сумму префикса (которая описывает положение / сдвиг матрицы) и затем получить доступ к информации в 2 этапа.

Но мои вопросы все еще открыты.

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

звучит так, как вам нужно:

multi_array<ublas::matrix<type>,2>
0 голосов
/ 11 ноября 2015

Boost.MultiArray работает с непрерывной памятью (логически упорядоченной во многих измерениях), поэтому трудно добавлять элементы во внутренние измерения. MultiArrays может быть динамически изменен, например, добавлять элементы в любом измерении, но это дорогостоящая операция, которая почти наверняка требует (внутреннего) перераспределения и копирования.

Из-за этого требования MultiArray - не лучший вариант. Но из того, что вы говорите, похоже, вам подойдет комбинация из двух.

boost::multi_array<std::vector<std::vector<type>>, 2> data

Очень приятно то, что интерфейс индексации не меняется относительно boost::multi_array<type, 4>. Например, data[1][2][3][4] все еще имеет смысл.

Я не знаю из вашего поста, как вы справляетесь с внутренним измерением, но может даже иметь смысл использовать это:

boost::multi_array<boost::multi_array<type>, 2>, 2> data

В любом случае, если вам действительно не нужна линейная алгебра, я бы держался в стороне от boost::ublas::array или, самое большее, использовал ее для внутреннего массива, если type числовой. boost::multi_array<boost::ublas::array<type>, 2> data, который упоминается в другом ответе.

...