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;
(단,arrayWidth
X축을 따라 측정되며,arrayHeight
Y축을 따라)
물론 다른 고유한 매핑을 제공하는 여러 가지 공식을 생각해 낼 수 있지만, 보통은 그럴 필요가 없습니다.
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
'programing' 카테고리의 다른 글
Firestore는 텍스트 영역의 줄 바꿈을 저장하지 않습니다. (0) | 2022.07.23 |
---|---|
Java에서 String Builder를 사용하는 경우 (0) | 2022.07.23 |
VueJ에서 Vuex 액션이 디스패치되었는지 유닛 테스트하는 방법s (0) | 2022.07.23 |
조작 가능한 편집이 Vuex 변환 오류를 트리거합니다. (0) | 2022.07.23 |
경고: 내장 함수 'printf'의 비호환 암묵적 선언 [기본값으로 유효] (0) | 2022.07.23 |