programing

2D 어레이를 1D 어레이에 매핑

prostudy 2022. 7. 23. 09:06
반응형

2D 어레이를 1D 어레이에 매핑

2D 어레이를 1D 어레이로 표현하고 싶습니다.함수는 두 개의 표시(x,y)와 저장할 값을 전달합니다.이 두 가지 지표는 1D 어레이의 단일 요소를 나타내며 그에 따라 설정합니다.1D 어레이의 크기는 arrayWidth×array여야 한다는 것을 알고 있습니다.높이, 하지만 각 요소를 어떻게 설정해야 할지 모르겠어요.

예를 들어 (2,4,3)과 (4,2,3)를 구별하려면 어떻게 해야 합니까?어레이를 x*y로 설정해 보았습니다만, 2*4와 4*2로 설정하면 어레이내의 같은 스팟이 되기 때문에, 다른 스팟이 필요합니다.

배열 요소를 행 순서 또는 열 순서로 저장할지 여부를 결정한 후 일관성을 유지해야 합니다.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;  
 }

2D 어레이 인덱스를 1D 어레이 인덱스로 재계산하는 일반적인 공식은 다음과 같습니다.

index = indexX * arrayWidth + indexY;

또는 다음 중 하나를 사용할 수 있습니다.

index = indexY * arrayHeight + indexX;

(단,arrayWidthX축을 따라 측정되며,arrayHeightY축을 따라)

물론 다른 고유한 매핑을 제공하는 여러 가지 공식을 생각해 낼 수 있지만, 보통은 그럴 필요가 없습니다.

C/C++ 언어에서는 내장된 다차원 배열이 메모리에 저장되므로 마지막 색인이 가장 빠르게 변경됩니다. 즉, 다음과 같이 선언된 배열의 경우

int xy[10][10];

요소xy[5][3]그 직후에 이어지다xy[5][4]기억 속에.위의 두 가지 공식 중 하나를 선택하여 두 가지 중 "마지막"으로 간주하는 색인(X 또는 Y)에 따라 선택할 수도 있습니다.

예: SIZE_X 및 SIZE_Y 크기의 2D 배열을 나타냅니다.즉, MAXXY의 연속된 행이 MAXX 사이즈가 됩니다.따라서 설정 함수는

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

얻을 수 있는 것은 다음과 같습니다.

int get_array( int x, int y ) { return array[ x * SIZE_Y + y ]; }

줄자 사용 예:

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);

다른 사람이 말했듯이 C 맵은 행 순서로 표시됩니다.

   #include <stdio.h>

   int main(int argc, char **argv) {
   int i, j, k;
   int arr[5][3];
   int *arr2 = (int*)arr;

       for (k=0; k<15; k++) {
          arr2[k] = k;
          printf("arr[%d] = %2d\n", k, arr2[k]);
       }

       for (i=0; i<5; i++) {
         for (j=0; j< 3; j++) {
            printf("arr2[%d][%d] = %2d\n", i, j ,arr[i][j]);
         }
       } 
    } 

출력:

arr[0] =  0
arr[1] =  1
arr[2] =  2
arr[3] =  3
arr[4] =  4
arr[5] =  5
arr[6] =  6
arr[7] =  7
arr[8] =  8
arr[9] =  9
arr[10] = 10
arr[11] = 11
arr[12] = 12
arr[13] = 13
arr[14] = 14
arr2[0][0] =  0
arr2[0][1] =  1
arr2[0][2] =  2
arr2[1][0] =  3
arr2[1][1] =  4
arr2[1][2] =  5
arr2[2][0] =  6
arr2[2][1] =  7
arr2[2][2] =  8
arr2[3][0] =  9
arr2[3][1] = 10
arr2[3][2] = 11
arr2[4][0] = 12
arr2[4][1] = 13
arr2[4][2] = 14

간단한 포인터를 사용하여 2D 어레이에 액세스할 수 있습니다.어레이[x][y]는 p[0x * width + 0y][0x * width + 1y]로 포인터에 배치됩니다.[0x * 폭 + n-1y] [1x * 폭 + 0y] 등

데이터를 사용하는 언어로 검색할 수 있도록 저장하는 것이 중요합니다.C-language는 0부터 치수 1까지 모든 인덱스를 실행한 상태에서 줄자 순서(첫 번째 행이 먼저 오고 두 번째 행이 모두...)로 저장됩니다.따라서 배열 x[2][3]의 순서는 x[0][0], x[0][1], x[2], x[1][0], x[1][2]입니다.따라서 C 언어에서는 x[i][j]는 1차원 배열 엔트리 x1dim[i*3 +j]와 같은 위치에 저장됩니다.이 방법으로 데이터를 저장하면 C언어로 쉽게 검색할 수 있습니다.

Fortran과 MATLAB은 다릅니다.열-주문자열(첫 번째 열 모두 먼저 오고 두 번째 열 모두...)로 저장되며 모든 인덱스는 1부터 해당 차원까지 실행됩니다.따라서 지수 순서는 C의 역순이며 모든 지수가 1보다 큽니다.데이터를 C 언어 순서로 저장하면 FORTRAN은 X_FORTRAN(j+1, i+1)을 사용하여 X_C_language[i][j]를 찾을 수 있습니다.예를 들어 X_C_language[1][2]는 X_FORTRAN(3,2)과 동일합니다.1차원 배열에서 데이터 값은 X1dim_입니다.C_language [ 2 * Cdim 2 + 3 ]X1dim과 같은 위치입니다.FORTRAN(2*Fdim1 + 3 + 1)지수의 순서가 거꾸로 되므로 Cdim2 = Fdim1임을 기억하십시오.

MATLAB는 FORTRAN과 동일하며, Ada는 C와 동일하지만 지수는 보통 1에서 시작한다.모든 언어는 C 또는 FORTRAN 순서 중 하나에 인덱스를 포함하며 인덱스는 0 또는 1에서 시작되며 저장된 데이터를 얻도록 적절히 조정할 수 있습니다.

이 설명이 혼란스럽다면 미안하지만 프로그래머가 아는 것이 정확하고 중요하다고 생각합니다.

언급URL : https://stackoverflow.com/questions/2151084/map-a-2d-array-onto-a-1d-array

반응형