初版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買此書,您也可以 支持 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 個欄和 10,000 個列的方陣),但其中大約只有五萬個條目不會是 nil(每個列有五個非 nil 欄,對應到每個節點的五個鄰居)。許多資料結構的書籍會長篇大論地討論如何實作這種稀疏矩陣,而不會浪費 400 MB 的記憶體,但你在使用 Lua 程式設計時不需要這些技巧。因為陣列是用表格表示的,所以它們自然就是稀疏的。使用我們的第一個表示法(表格的表格),你將需要一萬個表格,每個表格大約有五個元素,總共五十萬個條目。使用第二個表示法,你將只有一個表格,其中有五十萬個條目。無論使用哪一種表示法,你只需要為非 nil 元素保留空間即可。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |