第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但有一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店买到。
购买本书,您还可以帮助支持 Lua 项目


11.2 – 矩阵和多维数组

在 Lua 中表示矩阵主要有两种方法。第一种方法是使用数组的数组,即,一个表,其中每个元素都是另一个表。例如,您可以使用以下代码创建一个维度为 N 乘以 M 的零矩阵

    mt = {}          -- create the matrix
    for i=1,N do
      mt[i] = {}     -- create a new row
      for j=1,M do
        mt[i][j] = 0
      end
    end
由于表在 Lua 中是对象,因此您必须显式创建每一行才能创建一个矩阵。一方面,这肯定比在 C 或 Pascal 中声明一个矩阵更加冗长。另一方面,这为您提供了更大的灵活性。例如,您可以通过将上一示例中的行
      for j=1,M do
更改为
      for j=1,i do
使用该代码,三角矩阵仅使用原始矩阵一半的内存。

在 Lua 中表示矩阵的第二种方法是将两个索引组合成一个索引。如果两个索引是整数,您可以将第一个索引乘以一个常数,然后添加第二个索引。使用此方法,以下代码将创建我们维度为 N 乘以 M 的零矩阵

    mt = {}          -- create the matrix
    for i=1,N do
      for j=1,M do
        mt[i*M + j] = 0
      end
    end

如果索引是字符串,您可以通过在两个索引之间连接一个字符来创建单个索引,以将它们分隔开。例如,您可以使用代码 m[s..':'..t] 对具有字符串索引 st 的矩阵 m 进行索引,前提是 st 都不包含冒号(否则,诸如 ("a:", "b") 和 ("a", ":b") 的对将合并成单个索引 "a::b")。如有疑问,您可以使用诸如 `\0´ 的控制字符来分隔索引。



应用程序通常使用稀疏矩阵,其中大多数元素为 0 或 nil。例如,您可以通过邻接矩阵表示一个图,其中仅当节点 mn 以成本 x 连接时,位置 m,n 中的值才为 x;当这些节点未连接时,位置 m,n 中的值为 nil。要表示一个具有 10,000 个节点的图,其中每个节点大约有 5 个邻居,您将需要一个包含一亿个条目的矩阵(具有 10,000 列和 10,000 行的方阵),但其中大约只有 50,000 个条目不会为 nil(每行 5 个非 nil 列,对应于每个节点的 5 个邻居)。许多关于数据结构的书籍都详细讨论了如何在不浪费 400 MB 内存的情况下实现此类稀疏矩阵,但在用 Lua 编程时不需要这些技术。由于数组由表表示,因此它们自然稀疏。使用我们的第一个表示(表的表),您将需要 10,000 个表,每个表大约有 5 个元素,总共 50,000 个条目。使用第二个表示,您将拥有一个表,其中包含 50,000 个条目。无论采用哪种表示,您只需要为非 nil 元素预留空间。