Возможности многомерных массивов С++

68
3

Я бы хотел перевести некоторый существующий код Matlab, который, естественно, использует много многомерных массивов, и мне интересно, какие из них возможны. Я хочу, чтобы в контейнерах были конструкторы копирования, конструкторы по умолчанию, если это возможно, явные сообщения об ошибках при компиляции, доступ через A[i][j] и, как правило, не вызывает проблем. Предпочтительно они должны использовать операцию std::move для скорости.


Насколько я вижу, варианты сводятся к:


    std::vector повторяется. Это действительно работает, но, похоже, глупо писать std::vector<std::vector<std::vector<double> > > для 3D-массива. Я также обеспокоен накладными расходами на скорость и память.


    boost:: multiarray и блиц:: Array предлагает большинство функций, но не работает в конструкторе копирования (см. qaru.site/questions/637675/...) во время выполнения. Мне непонятно, есть ли веские причины для этого.


    Библиотека Eigen кажется очень быстрой, но она вообще не позволяет копировать и не имеет конструктора по умолчанию, что означает, что необходимо использовать другой контейнер.


    std::array имеет тот недостаток, что размер должен быть известен, когда объект создан, поэтому конструкторы по умолчанию отсутствуют.


Существует ли более простой многомерный контейнер, удовлетворяющий всем запросам, но более экономный, чем повторный std::vector?

спросил(а) 2014-11-13T15:44:00+03:00 5 лет назад
3
Решение
46

Я не уверен, что это может ответить на все ваши потребности, но я сам должен был обрабатывать многомерные массивы для создания сетки/сетки и хотел создать для этого свой собственный класс.
Мой класс позволяет называть его MultiArray использует одномерный вектор в качестве контейнера.


Например, запись MultiArray < 4, float, 10, 15, 10, 18 > A() создаст многоадресную матрицу A [10] [15] [10] [18] в векторе размером 10 * 15 * 10 * 18.

Я могу получить доступ к элементам по одному индексу A (i) или по координатам A [i] [j] [k] [l], вызывая A ({i, j, k, l}). Для достижения цели я предварительно вычислил в конструкторе произведение размеров, чтобы быстро вычислить координаты- > индекс или индекс- > .


Код является общим для N измерений. Я могу детализировать некоторые части, если вы хотите.

ответил(а) 2014-12-20T02:27:00+03:00 4 года, 11 месяцев назад
Еще 2 ответа
45

Существует хороший пакет линейной алгебры, называемый Armadillo


http://arma.sourceforge.net/

использовал его с R, счастливым пользователем

ответил(а) 2014-12-20T02:42:00+03:00 4 года, 11 месяцев назад
33

Вы пропустили еще один вариант:


    станд:: valarray

В зависимости от ваших требований это может быть полезно.
http://www.cplusplus.com/reference/valarray/

ответил(а) 2014-12-20T02:08:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема