2011-01-26 11 views

ответ

6

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

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

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

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

+0

Спасибо! - последнее, что нужно уточнить - если я получаю доступ в j i k (майор столбца?), я мог бы просто поменять местами, где j и i находятся в вычислении индекса, правильно? – Derek

+0

@Derek: вы должны убедиться, что если вы меняете размеры, вы правильно подставляете индексы * и * размеры. –

0

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

0

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

0

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

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

См. http://www.nr.com/cpppages/chapappsel.pdf для описания.

+0

Возможно, это было бы не так быстро, поскольку для доступа к определенному значению потребовались бы 3 указателя, а не только 1. –

+0

Уточнения указателя быстрее, чем умножения? – John

+0

Всё зависит от меня. На платформе с аппаратным множителем, вероятно, нет. Для каждого разыменования требуется считывание памяти (с возможностью промаха в кэше), и все они зависимы, поэтому они должны выполняться последовательно. –

-4

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

for i 
    for j 
     for k 

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

+0

Как это решает вопрос? –

+0

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

Смежные вопросы