在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网站上,我看到了第二种变体

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 '?')

可以解释一下第二个变量是如何工作的吗? 也许我误解了它。

点赞
用户183120
用户183120

我不明白它是如何工作的。

对于一个二维数组,其维度为 N(行)x M(列),所需元素的总数为 N * M。现在以单个数组的形式一次性创建 N * M 个元素,则实际上在内存中将具有一个 1D 数组(压缩的 2D 数组)。由于该公式假设数组索引从 0 而非常规的 Lua 的 1 开始,因此我们将按照 0 进行排序:第一组索引为 [0, M - 1]M 个项形成第 0 行,第二组索引为 [M, 2M - 1]M 个项形成第 1 行,以此类推。

5 x 2 数组的存储器布局;在该 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 --|

要访问元素 (i, j),则需要超过 i - 1 行,然后访问第 i 行上的第 j 项。但是,由于索引已经减少了一个,因为索引从 0 开始,所以 i 可以直接使用。因此,i * rows + j 给出正确的索引。

[i*M + j] 索引应如何创建行和列?

并不是。这是对数字 1D 数组的一个抽象,给出矩阵的接口。在诸如 C 的编程语言中,声明一个二维数组时,大多数实现都采用类似的方法。int a[2][3] 将创建一个包含 6 个整数的数组,并使用上述公式进行索引,因此这不是一个罕见的模式。

2016-01-12 13:18:42
用户1190388
用户1190388

_ Lua PiL _ 上提供的变体实际上是将二维数组表示/映射为一维数组。

基本上,考虑以下的 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
}
2016-01-12 13:28:48