web-dev-qa-db-ja.com

行列のインデックスを1次元配列にマッピングする方法(C ++)

次のような8x8マトリックスがあります。

char matrix[8][8];

また、次のような64個の要素の配列があります。

char array[64];

次に、マトリックスを表として描画し、セルに数値を入力しました。各数値は左から右、上から下に増分されます。

たとえば、マトリックスにインデックス3(列)と4(行)がある場合、これは配列の35の位置にある要素に対応していることがわかります。これは、描画した表に見られます。マトリックスの2つのインデックスを配列の単一のインデックスに変換する何らかの種類の式があると思いますが、それが何であるかはわかりません。

何か案は?

ほとんどの言語が多次元配列を格納する方法は、次のような変換を行うことです。

matrixにサイズがある場合、n x m [すなわちiは0から(n-1)に、jは0から(m-1)]になります。

_matrix[ i ][ j ] = array[ i*m + j ]_。

そのため、基数「n」の数値システムのようになります。最後の次元のサイズは重要ではないことに注意してください。


概念を理解するために、行番号として「i」、列番号として「j」を持つ(3x5)マトリックスを考えてください。 i,j = (0,0) --> 0から番号付けを開始する場合。 'row-major'順序(このような)の場合、レイアウトは次のようになります。

_           |-------- 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..._になります。 2行目に到達すると、すでに_5_エントリがあるので、インデックス_1*5 + 0,1,2..._から始めます。 3行目には_2*5_エントリがすでにあるため、インデックスは_2*5 + 0,1,2..._です。

高次元の場合、この考え方は一般化されます。つまり、3D matrix L by N by 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

80
DilithiumMatrix

行優先順序については、ステートメント_matrix[ i ][ j ] = array[ i*n + j ]_が間違っていると思います。

オフセットはoffset = (row * NUMCOLS) + columnである必要があります。

ステートメントは_row * NUMROWS + column_になりますが、これは間違っています。

あなたが提供したリンクは正しい説明を与えます。

11
mvelusce

このようなもの?

//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;
};
5
Donny Verduijn