в C++, каково значение индексации для 3D-массива W * H * D?3d -> 1D индексирование массива
для конкретного I, J, K это правильный индексирование:
я * W * H + J * W + к
в C++, каково значение индексации для 3D-массива W * H * D?3d -> 1D индексирование массива
для конкретного I, J, K это правильный индексирование:
я * W * H + J * W + к
То, что вы написали равносильно арифметики указателей, что это будет делать:
T x[D][H][W];
x[i][j][k]; // Pointer arithmetic done here
Очевидно, что в зависимости от того, как вы заказываете D
, H
и W
(или i
, j
, k
), то расчет будет отличаться.
Нет ни одного «правильного» заказа, но версия, которую вы указали, должна работать. Порядок, в котором вы применяете индексы, определит, будете ли вы делать индексацию строк или столбцов. Если вы портируете код Fortran (например), имеет смысл отменить «нормальный» заказ C.
Ширина, высота и глубина в этом контексте не имеют смысла. Что вам нужно знать, так это то, что многомерные массивы хранятся в row-major order.
Да, при условии, что i
варьируется от 0 ... D-1, j
варьируется от 0 ... H-1 и k
варьируется от 0 ... W-1.
Как правило, цель индексатора, как я думал, заключалась в том, чтобы выражать отношения в разреженной матрице, поэтому вам не нужно было разбираться во всем (и тратить на нее память). Если ваши данные охватывают всю матрицу, вы можете задуматься о создании 3d-матрицы как указателя на массив указателей, каждый из которых указывает на массив указателей. Используя это, вы можете использовать нотацию x[i][j][k]
, но может быть быстрее.
См. http://www.nr.com/cpppages/chapappsel.pdf для описания.
Возможно, это было бы не так быстро, поскольку для доступа к определенному значению потребовались бы 3 указателя, а не только 1. –
Уточнения указателя быстрее, чем умножения? – John
Всё зависит от меня. На платформе с аппаратным множителем, вероятно, нет. Для каждого разыменования требуется считывание памяти (с возможностью промаха в кэше), и все они зависимы, поэтому они должны выполняться последовательно. –
Если вам нужно, чтобы iterarate по всем элементам, лучше делать в
for i
for j
for k
порядке. Таким образом, это было бы самым быстрым, потому что индекс массива каждый раз увеличивается на единицу, а значения могут быть выгружены. Существует не один правильный способ сделать это, но вы, вероятно, выбрали лучший.
Как это решает вопрос? –
Беспокойство есть причина, что он выбрал порядок, как и он. Он мог выбрать любой заказ, который хотел, но в этом случае итерация по всем элементам будет медленнее с тем же порядком итерации. –
Спасибо! - последнее, что нужно уточнить - если я получаю доступ в j i k (майор столбца?), я мог бы просто поменять местами, где j и i находятся в вычислении индекса, правильно? – Derek
@Derek: вы должны убедиться, что если вы меняете размеры, вы правильно подставляете индексы * и * размеры. –