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