Matrix Lua中的混淆矩阵生成示例

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]索引应该如何创建行和列?

如果要在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]
索引应该如何创建行和列? 其次,我尝试了这个变体,它可以工作,但它返回的实际上是一个数组,而不是NxM矩阵:

M = function get_zero_matrix2(10, 20)
print(#M, #M[1])

> attempt to get length of a nil value (field '?')
你能解释一下第二种变体是如何工作的吗? 也许我误解了

我不明白它是怎么工作的

对于维度
N
(行)x
M
(列)的二维数组,所需元素的总数=
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]
它不以任何方式创建行和列。它只是存储在一行数字中的数据。你必须实现你自己的逻辑;在这里,基本上;is
i*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
}