Отобразите 2D массив на 1D массив

Я хочу представить 2D массив с 1D массив. Функция передаст два indicies (x, y) и значение для хранения. Эти два indicies представили бы единственный элемент 1D массив и установили бы его соответственно. Я знаю 1D, массив должен иметь размер arrayWidth × arrayHeight, но я не знаю, как установить каждый элемент.

Например, как я различаю (2,4,3) от (4,2,3)? Я пытался установить массив, поскольку x*y, но 2*4 и 4*2 приведет к тому же пятну в массиве, и мне нужны они, чтобы отличаться.

81
задан Palec 27 October 2017 в 10:27
поделиться

5 ответов

Вам необходимо решить, будут ли элементы массива храниться в порядке строки или порядка столбцов, а затем будет последовательным. http://en.wikipedia.org/wiki/row-major_order

Язык C использует порядок строки для многомерных массивов

для моделирования этого с одним размером массива, вы умножаете индекс строки по ширине и добавьте индекс колонны таким образом:

 int array[width * height];

 int SetElement(int row, int col, int value)
 {
    array[width * row + col] = value;  
 }
145
ответ дан 24 November 2019 в 09:33
поделиться

Использование ряда основных примеров:

A(i,j) = a[i + j*ld]; // where ld is the leading dimension
                      // (commonly same as array dimension in i)

// matrix like notation using preprocessor hack, allows to hide indexing
#define A(i,j) A[(i) + (j)*ld]

double *A = ...;
size_t ld = ...;
A(i,j) = ...;
... = A(j,i);
1
ответ дан 24 November 2019 в 09:33
поделиться

Вы должны иметь возможность доступа к 2D-массиву простым указателем на месте. Массив [x] [y] будет расположен в указателе, так как P [0x * ширина + 0Y] [0x * ширина + 1y] ... [0x * ширина + N-1Y] [1x * ширина + 0Y] и т. Д.

-2
ответ дан 24 November 2019 в 09:33
поделиться

Пример: мы хотим представить двухмерный массив размера SIZE_X и SIZE_Y. Это означает, что мы будем иметь MAXY последовательных рядов размера MAXX. Следовательно, функция set is

void set_array( int x, int y, int val ) { array[ x * SIZE_Y + y ] = val; }

The get would be:

int get_array( int x, int y ) { return array[ x * SIZE_Y + y ]; }
15
ответ дан 24 November 2019 в 09:33
поделиться

Типичная формула для пересчета 2D-массива индексов в 1D-массив индекс равен

index = indexX * arrayWidth + indexY;

В качестве альтернативы вы можете использовать

index = indexY * arrayHeight + indexX;

(при условии, что arrayWidth измеряется по оси X, а arrayHeight по оси Y)

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

В языках C / C ++ встроенные многомерные массивы хранятся в памяти, поэтому последний индекс изменяется быстрее всего, что означает, что для массива, объявленного как

int xy[10][10];

element xy [5] [3] сразу за ним следует xy [5] [4] в памяти. Возможно, вы захотите также следовать этому соглашению, выбрав одну из двух приведенных выше формул в зависимости от того, какой индекс (X или Y) вы считаете «последним» из двух.

17
ответ дан 24 November 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: