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

char matrix[8][8];

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

char array[64];

然后我把矩阵画成一张表格,用数字填充单元格,每个数字从左到右,从上到下递增.

比方说,如果我在矩阵中有索引3(列)和4(行),我知道它对应于数组中位置35的元素,就像我画的表中可以看到的那样.我相信有某种公式可以将矩阵的2个索引转换为数组的单个索引,但是我不知道它是什么.

有什么主意吗?

推荐答案

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

如果matrix的大小是n(行)乘m(列),我们使用"row-major ordering"(我们首先沿着行数),那么:

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

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

所以它就像一个以‘m’为基数的数字系统.请注意,最后一个维度的大小(这里是行数)并不重要.


对于概念性理解,请考虑一个行号为‘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....当你到达第二行时,你已经有5个条目,所以你从索引1*5 + 0,1,2...开始.在第三行,您已经有2*5个条目,因此索引是2*5 + 0,1,2....

对于更高的维度,这个 idea 是通用的,即对于3D matrix L×N×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

C++相关问答推荐

C中空终止符后面的数字?

减法运算结果的平方的最快方法?

向上强制转换C中的数值类型总是可逆的吗?

初始变量重置后,char[]的赋值将消失

在为hashmap创建加载器时,我的存储桶指向它自己

函数的限制限定指针参数允许优化调用方函数吗?

为什么中断函数会以这种方式影响数组?

如何用c语言修改shadow文件hash部分(编程)?

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

如何摆脱-WIMPLICIT-Function-声明

Fscanf打印除退出C代码为1的程序外的所有内容

程序如何解释变量中的值

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

强制GCC始终加载常量(即只读),即使启用了优化

用C++初始化局部数组变量

execve 不给出which命令的输出

将数组中的所有元素初始化为 struct 中的相同值

多行表达式:C 编译器如何处理换行符?

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

C simd _m128 晶圆厂