Boost multiarray 3D

Я использую массив Mutli для 2D, как показано ниже,

typedef boost::multi_array<double, 2> array_type;
typedef array_type::index index;
// initialize array
array_type U(boost::extents[N][3]);
for(index i = 0; i != N; ++i) {
for(index j = 0; j != 3; ++j){
U[i][j] = 0;
}
}

double * pU = U.data();
double (*arrayU)[3] = (double (*)[3])pU;

Сейчас я пытаюсь реализовать это, но для 3D, пока я написал следующее,

typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
// initialize array
array_type U(boost::extents[M][N][4]);
for(index i = 0; i != M; ++i) {
for(index j = 0; j != N; ++j){
for(index k = 0; k != 4; ++k){
U[i][j][k] = 0;
}
}
}

Но следующая часть все еще сбивает меня с толку, не могли бы вы сказать мне, как это сделать, и немного объяснить?

    double * pU = U.data();
double (*arrayU)[3] = (double (*)[3])pU;

Спасибо!

0

Решение

multi_array<T>.data() возвращает указатель на начало смежного блока, затем приводит указатель на указатель массива из 3 двойных чисел, который является элементом массива массивов. Посмотрите на эту ссылку: Указатель на 2d массив
РЕДАКТИРОВАТЬ:
То же самое для 3D-массива, например, вы пишете это для 3D-массива:

double * pU = U.data();
double (*arrayU)[N][4] = (double (*)[N][4])pU;

Вы объявили arrayU быть указателем на N * 4-матрицу double, то есть указывать на массив из N массивов из 4 double. Учитывая это, arrayU[0] является массивом из N массивов из 4 двойных Однако, поскольку это массив, он автоматически преобразуется в указатель на первый элемент массива.

2

Другие решения

Других решений пока нет …