第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但有一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店买到。
购买本书,您还可以帮助支持 Lua 项目。
用 Lua 编程 | ||
第二部分。表和对象 第 11 章。数据结构 |
在 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]
对具有字符串索引 s
和 t
的矩阵 m
进行索引,前提是 s
和 t
都不包含冒号(否则,诸如 ("a:"
, "b"
) 和 ("a"
, ":b"
) 的对将合并成单个索引 "a::b"
)。如有疑问,您可以使用诸如 `\0
´ 的控制字符来分隔索引。
应用程序通常使用稀疏矩阵,其中大多数元素为 0 或 nil。例如,您可以通过邻接矩阵表示一个图,其中仅当节点 m
和 n
以成本 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 元素预留空间。
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |