3d -> индексирование 1D массива - PullRequest
3 голосов
/ 27 января 2011

в C ++, каково значение индексации для трехмерного массива размера W * H * D?

для определенного i, j, k это правильная индексация:

i *W * H + J * W + K

Ответы [ 5 ]

6 голосов
/ 27 января 2011

То, что вы написали, эквивалентно арифметике указателя, что это будет делать:

T x[D][H][W];

x[i][j][k];  // Pointer arithmetic done here

Очевидно, в зависимости от того, как вы заказываете D, H и W (или i, j, k), расчет будет другим.

0 голосов
/ 27 января 2011

Если вам нужно перебрать все элементы, лучше всего это сделать в

for i
    for j
        for k

заказ. Таким образом, это будет самым быстрым, потому что индекс массива увеличивается на единицу каждый раз, и значения могут быть переданы. Не существует единственного правильного способа сделать это, но вы, вероятно, выбрали лучший.

0 голосов
/ 27 января 2011

Да, при условии, что i изменяется от 0 ... D-1, j изменяется от 0 ... H-1, а k изменяется от 0 ... W-1.

Обычно, как мне показалось, целью создания индексатора было выражение отношений в разреженной матрице, чтобы вам не приходилось иметь дело со всем этим (и тратить на это память).Если ваши данные охватывают всю матрицу, вы можете посмотреть на создание трехмерной матрицы в качестве указателя на массив указателей, каждый из которых сам по себе указывает на массив указателей.Это позволяет использовать нотацию x[i][j][k], но может быть быстрее.

См. Описание http://www.nr.com/cpppages/chapappsel.pdf.

0 голосов
/ 27 января 2011

Ширина, высота и глубина не имеют смысла в этом контексте. Что вам нужно знать, так это то, что многомерные массивы хранятся в главном порядке строк .

0 голосов
/ 27 января 2011

Нет единого «правильного» порядка, но указанная вами версия должна работать.Порядок, в котором вы применяете индексы, будет определять, будете ли вы выполнять индексацию по ряду строк или по столбцам.Если вы переносите код на Фортране (например), имеет смысл поменять местами «нормальный» порядок C.

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