Повышение многомассивности 3D

Я использую массив boost 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;

Спасибо!


person heri-salmas    schedule 27.03.2014    source источник
comment
У вас опечатка в самом внутреннем цикле. Это может быть то, что вас смущает.   -  person alfC    schedule 27.03.2014


Ответы (1)


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

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

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

person jfly    schedule 27.03.2014
comment
все еще не совсем понятно, тогда для трехмерного массива я должен написать: double * pU = U.data(); двойной (массивU)[N][4] = (двойной ()[N][4])pU; - person heri-salmas; 27.03.2014