48

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

char matrix[8][8];

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

char array[64];

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

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

何か案は?

4

3 に答える 3

97

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

サイズがn matrix(行) 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...です。2 行目に到達すると、既に5エントリがあるため、indexes から開始します1*5 + 0,1,2...。3 行目には2*5既にエントリがあるため、インデックスは2*5 + 0,1,2...です。

高次元の場合、このアイデアは一般化されます。つまり、matrixL x N x Mの 3D の場合です。

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

于 2012-12-23T23:40:24.623 に答える
12

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

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

あなたのステートメントの結果は になりますがrow * NUMROWS + column、これは間違っています。

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

于 2014-03-04T11:13:35.173 に答える
7

このようなもの?

//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;
};
于 2014-11-23T02:07:19.970 に答える