48

我有一个 8x8 矩阵,如下所示:

char matrix[8][8];

另外,我有一个包含 64 个元素的数组,如下所示:

char array[64];

然后我将矩阵绘制为表格,并用数字填充单元格,每个数字从左到右,从上到下递增。

如果我在矩阵中有索引 3(列)和 4(行),我知道它对应于数组中位置 35 的元素,正如我绘制的表格中所示。我相信有某种公式可以将矩阵的 2 个索引转换为数组的单个索引,但我不知道它是什么。

有任何想法吗?

4

3 回答 3

97

大多数语言存储多维数组的方式是进行如下转换:

如果matrix具有大小,n(行)乘 m(列),并且我们使用“行优先排序”(我们首先沿行计数),那么:

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

这里 i 从 0 到 (n-1), j 从 0 到 (m-1)。

所以它就像一个以'm'为底的数字系统。请注意,最后一个维度的大小(此处为行数)并不重要。


对于概念上的理解,可以考虑一个 (3x5) 矩阵,其中“i”作为行号,“j”作为列号。如果您从 开始编号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.... 当您到达第二行时,您已经有5条目,因此您从 indices 开始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

于 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 回答