programing

매트릭스의 인덱스를 1차원 배열(C++)에 매핑하려면 어떻게 해야 합니까?

goodsources 2022. 8. 7. 16:53
반응형

매트릭스의 인덱스를 1차원 배열(C++)에 매핑하려면 어떻게 해야 합니까?

8x8 매트릭스가 있는데, 다음과 같습니다.

char matrix[8][8];

또, 다음과 같은 64개의 요소가 배열되어 있습니다.

char array[64];

그리고 매트릭스를 표로 그리고 셀을 숫자로 채웁니다. 각 숫자는 왼쪽에서 오른쪽으로, 위에서 아래로 증가합니다.

예를 들어 인덱스 3(컬럼)과 4(행)를 매트릭스에 포함시키면 내가 그린 표에서 볼 수 있듯이 어레이의 위치 35에 있는 요소에 해당한다는 것을 알 수 있습니다.매트릭스의 2개의 인덱스를 배열의 단일 인덱스로 변환하는 공식이 있다고 생각합니다만, 그것이 무엇인지 알 수 없습니다.

좋은 생각 있어요?

대부분의 언어가 다차원 배열을 저장하는 방법은 다음과 같습니다.

한다면matrix에는 크기가 n(행) x m(행)이며, 여기서는 "행-주요 순서"를 사용하고 있습니다(행에서 먼저 카운트합니다.

matrix[ i ][ j ] = array[ i*m + j ].

여기서 i는 0에서 (n-1)로, j는 0에서 (m-1)로 갑니다.

즉, 기본 'm'의 숫자 체계와 같습니다.마지막 치수(여기서는 행 수)의 크기는 중요하지 않습니다.


개념적으로 이해하기 위해 행 번호로 'i'를 사용하고 열 번호로 'j'를 사용하는 (3x5) 행렬을 생각해 보십시오.번호를 매기기 시작하면i,j = (0,0) --> 0. '세우기' 순서(이렇게)의 경우 레이아웃은 다음과 같습니다.

           |-------- 5 ---------|
  Row      ______________________   _ _
   0      |0    1    2    3    4 |   |
   1      |5    6    7    8    9 |   3
   2      |10   11   12   13   14|  _|_
          |______________________|
Column     0    1    2    3    4 

행을 따라 이동하면(즉, 열 수를 늘리면) 카운트가 시작되므로 배열 인덱스는0,1,2...두 번째 줄에 도착했을 때 이미 두 번째 줄에는5엔트리는 인덱스로 시작합니다.1*5 + 0,1,2...세 번째 줄에는 다음과 같은 항목이 있습니다.2*5엔트리가 이미 있기 때문에 인덱스는2*5 + 0,1,2....

고차원의 경우, 이 아이디어는 일반화되어 있습니다. 즉, 3D의 경우matrixL x N x M:

matrix[ i ][ j ][ k ] = array[ i*(N*M) + j*M + k ]

기타 등등.


자세한 설명은 http://www.cplusplus.com/doc/tutorial/arrays/;을 참조해 주세요.또한 기술적인 측면은 http://en.wikipedia.org/wiki/Row-major_order을 참조해 주세요.

줄서기 주문의 경우, 나는 그 문구가matrix[ i ][ j ] = array[ i*n + j ]틀렸습니다.

오프셋은 다음과 같아야 합니다.offset = (row * NUMCOLS) + column.

당신의 진술은 다음과 같습니다.row * NUMROWS + column그건 잘못된 거야

제공된 링크는 올바른 설명을 제공합니다.

이런 거?

//columns = amount of columns, x = column, y = row
var calculateIndex = function(columns, x, y){
    return y * columns + x;
};

다음 예제에서는 인덱스를 다시 x 및 y 좌표로 변환합니다.

//i = index, x = amount of columns, y = amount of rows
var calculateCoordinates = function(index, columns, rows){
    //for each row
    for(var i=0; i<rows; i++){
        //check if the index parameter is in the row
        if(index < (columns * i) + columns && index >= columns * i){
            //return x, y
            return [index - columns * i, i];
        }
    }
    return null;
};

언급URL : https://stackoverflow.com/questions/14015556/how-to-map-the-indexes-of-a-matrix-to-a-1-dimensional-array-c

반응형