Matrix Lua中的混淆矩阵生成示例
如果要在Lua中创建NxM矩阵,基本上可以执行以下操作:Matrix Lua中的混淆矩阵生成示例,matrix,multidimensional-array,lua,Matrix,Multidimensional Array,Lua,如果要在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官方网站上,我看到了: 首先,我不明白它是如何工作的。[i*M+j]索引应该如何创建行和列?
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官方网站上,我看到了:
首先,我不明白它是如何工作的。[i*M+j]
索引应该如何创建行和列?
其次,我尝试了这个变体,它可以工作,但它返回的实际上是一个数组,而不是NxM矩阵:
M = function get_zero_matrix2(10, 20)
print(#M, #M[1])
> attempt to get length of a nil value (field '?')
你能解释一下第二种变体是如何工作的吗?
也许我误解了
我不明白它是怎么工作的
对于维度N
(行)xM
(列)的二维数组,所需元素的总数=N*M
。现在一次创建N*M
元素作为单个数组,我们将在内存中基本上有一个1D数组(扁平2D数组)。由于该公式假定数组索引从0
开始,而不是1
(通常的Lua约定),因此我们将遵循0
:第一个M
项的索引[0,M-1]
格式行0
,下一个M
项的索引[M,2M-1]/code>格式行1
,依此类推
5x2
阵列的内存布局;这个1D数组中的索引4
是2D数组中的(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 --|
--+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--
... | 0,0 | 0,1 | 1,0 | 1,1 | 2,0 | 2,1 | 3,0 | 3,1 | 4,0 | 4,1 | ...
--+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--
|--第0行--|--第1行--|--第2行--|--第3行--|--第4行--|
要访问元素(i,j)
,可以通过i-1
行,然后访问i
第行上的j
第项。但是索引已经少了一个,因为索引从0
开始,所以i
可以按原样使用。因此,i*rows+j
给出了正确的索引
[i*M+j]
索引应该如何创建行和列
没有。它是对一维数字数组的抽象,给出了矩阵的接口。在像C这样的语言中,声明2D数组,大多数实现都做类似的事情inta[2][3]
将创建一个由6个整数组成的数组,并使用上面的公式进行索引,因此这不是一种罕见的模式。Lua PiL上可用的变量实际上是2D数组作为1D数组的表示/映射
基本上考虑以下2x3阵列/矩阵:
{
{11, 12, 13},
{21, 22, 23}
}
而变量将其创建为:
{
[4] = 11,
[5] = 12,
.
.
.
[9] = 23
}
现在,当您想要获取矩阵[1][x]
时,您将取而代之的是:
matrix[1 * rows + x]
它不以任何方式创建行和列。它只是存储在一行数字中的数据。你必须实现你自己的逻辑;在这里,基本上;isi*M+j
i*M+j
通常出现在具有0索引数组的语言中,如C,其中矩阵为:
{
[0] = 11,
[1] = 12,
[2] = 13,
.
.
.
[5] = 23
}
最好使
矩阵
成为局部变量……第二个变量仅仅是一个模拟2d矩阵的平坦1d数组,因此M[1]是一个数字,而不是矩阵的行/列,并且#M[1]无效。这将有助于提高性能。
{
[0] = 11,
[1] = 12,
[2] = 13,
.
.
.
[5] = 23
}