如果您想在Lua中创建NxM矩阵,您基本上可以执行以下操作:
function get_zero_matrix(rows, cols)
matrix = {}
for i=1, rows do
matrix[i] = {}
for j=1, cols do
matrix[i][j] = 0
end
end
return matrix
end
但是,在Lua官方网站上我看到了second variant:
function get_zero_matrix2(rows, cols)
mt = {}
for i=1, rows do
for j=1, cols do
mt[i*cols + j] = 0
end
end
return mt
end
首先,我不明白它是如何工作的。如何[i*M + j]
索引创建行和列?
其次,我尝试了这个变体,它可以工作,但它返回的实际上是一个数组,而不是NxM矩阵:
M = function get_zero_matrix2(10, 20)
print(#M, #M[1])
> attempt to get length of a nil value (field '?')
您能解释一下第二种变体是如何工作的吗? 也许我误解了它。
答案 0 :(得分:3)
我不明白它是如何运作的。
对于维度N
(行)x M
(cols)的2D数组,所需元素的总数= N * M
。现在在一个镜头中创建N * M
个元素作为单个数组,我们在内存中基本上有一个1D数组(扁平的2D数组)。由于公式假设数组索引以0
开头而不是1
(通常是Lua的惯例),我们将关注0
:第一个M
索引为[0, M - 1]
的项目形成行0
,带有索引M
的下一个[M, 2M - 1]
项目形成行1
,依此类推。
5 x 2
数组的内存布局;此二维数组中的索引4
在二维数组中为(2, 0)
。
--+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-- ... | 0,0 | 0,1 | 1,0 | 1,1 | 2,0 | 2,1 | 3,0 | 3,1 | 4,0 | 4,1 | ... --+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-- |-- row 0 --|-- row 1 --|-- row 2 --|-- row 3 --|-- row 4 --|
要访问元素(i, j)
,可以访问i - 1
行,然后访问j
上的i
th 项排行。但索引已经少了一个,因为索引从0
开始,所以i
可以按原样使用。因此i * rows + j
给出正确的索引。
[i*M + j]
索引如何创建行和列?
它没有。它是一维数字数组的抽象,给出了矩阵的接口。在像C这样的语言中,声明一个二维数组,大多数实现都做类似的事情。 int a[2][3]
将创建一个包含6个整数的数组,并使用上面的公式进行索引,因此这不是一种不常见的模式。
答案 1 :(得分:1)
Lua PiL 上可用的变体实际上是2D阵列作为一维数组的表示/映射。
基本上,请考虑以下2x3数组/矩阵:
{
{11, 12, 13},
{21, 22, 23}
}
该变体将其创建为:
{
[4] = 11,
[5] = 12,
.
.
.
[9] = 23
}
现在,如果您愿意,让我们说,获取matrix[1][x]
,您将取代:
matrix[1 * rows + x]
不,以任何方式创建行和列。它只是存储在一行数字中的数据。你必须实现自己的逻辑;在这里,基本上;是i * M + j
。
i*M + j
通常出现在具有0索引数组的语言中,如C,其中矩阵为:
{
[0] = 11,
[1] = 12,
[2] = 13,
.
.
.
[5] = 23
}