在Lua中混淆矩阵生成示例

时间:2016-01-12 12:49:18

标签: 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官方网站上我看到了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 '?')

您能解释一下第二种变体是如何工作的吗? 也许我误解了它。

2 个答案:

答案 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
}