в C ++, каково значение индексации для трехмерного массива размера W * H * D?
для определенного i, j, k это правильная индексация:
i *W * H + J * W + K
То, что вы написали, эквивалентно арифметике указателя, что это будет делать:
T x[D][H][W]; x[i][j][k]; // Pointer arithmetic done here
Очевидно, в зависимости от того, как вы заказываете D, H и W (или i, j, k), расчет будет другим.
D
H
W
i
j
k
Если вам нужно перебрать все элементы, лучше всего это сделать в
for i for j for k
заказ. Таким образом, это будет самым быстрым, потому что индекс массива увеличивается на единицу каждый раз, и значения могут быть переданы. Не существует единственного правильного способа сделать это, но вы, вероятно, выбрали лучший.
Да, при условии, что i изменяется от 0 ... D-1, j изменяется от 0 ... H-1, а k изменяется от 0 ... W-1.
Обычно, как мне показалось, целью создания индексатора было выражение отношений в разреженной матрице, чтобы вам не приходилось иметь дело со всем этим (и тратить на это память).Если ваши данные охватывают всю матрицу, вы можете посмотреть на создание трехмерной матрицы в качестве указателя на массив указателей, каждый из которых сам по себе указывает на массив указателей.Это позволяет использовать нотацию x[i][j][k], но может быть быстрее.
x[i][j][k]
См. Описание http://www.nr.com/cpppages/chapappsel.pdf.
Ширина, высота и глубина не имеют смысла в этом контексте. Что вам нужно знать, так это то, что многомерные массивы хранятся в главном порядке строк .
Нет единого «правильного» порядка, но указанная вами версия должна работать.Порядок, в котором вы применяете индексы, будет определять, будете ли вы выполнять индексацию по ряду строк или по столбцам.Если вы переносите код на Фортране (например), имеет смысл поменять местами «нормальный» порядок C.