1. 名稱定義
Dim $Arr[維度1][維度2][維度3]...[維度N]
在說明多維陣列時,先以上為例定義出二個名詞出來。
(1) 維度:以上為例,$Arr 陣列維度即為 N 維。故一維陣列為 Dim $Arr[維度1];二維陣列為 Dim $Arr[維度1][維度2];依此類推。
(2) 元素:這是陣列裡面可以實際存取的單位,以一維陣列 Dim $Arr[2] = [1,2] 為例,實際上可以存取的元素是 $Arr[0] 與 $Arr[1];而二維陣列 $Arr[2][3] = [ [1,2,3],[4,5,6]]
2. 多維陣列之宣告
在某些情況下,我們使用到的陣列可能不是一維而是二維甚至是三維陣列。比如說,要存的是一張 bmp 圖檔的資訊。一張 bmp 圖檔假設高度為 $H,寬度為 $W,則共有 $H * $W 個點。然而每個點還有 R、G、B 三個向量所組成,所以宣告時可能會變成這樣:
Dim $W=800, $H=600
Dim $R[$W][$H],$G[$W][$H],$B[$W][$H]
也或者是直接宣告成一個三維陣列
Dim $W=800, $H=600
Dim $RGB[$W][$H][3]
這樣調用時,可以假設 $RGB[100][100][0] 為位於點 (100,100) 之 R 資訊;$RGB[100][100][1] 為位於點 (100,100) 之g 資訊;$RGB[100][100][2] 為位於點 (100,100) 之B 資訊。
至於初值設定的話可以這麼設
Dim $X[2][3] = [ [1,2,3],[4,5,6] ]
Dim $Y[2][3][4] = [ [ [1,2,3,4], [5,6,7,8], [9,10,11,12] ] , _
[ [13,14,15,16], [17,18,19,20], [21,22,23,24] ] ]
3. 使用多維陣列
假設二陣列已這麼宣告
Dim $Arr[3][2]
宣告時我沒給它初值,日後要設值給它的時候可以這麼做
$Arr[0][0] = "文字00"
$Arr[0][1] = "文字01"
$Arr[1][0] = "文字10"
$Arr[1][1] = "文字11"
$Arr[2][0] = "文字20"
$Arr[2][1] = "文字21"
而若通常陣列大時,也是用迴圈方式去跑,二維陣列以上通常都會配合讀檔方式把數值讀進來,讀檔日後再說明。現在示範用 loop 依序遞增二維陣列之值
Dim $x = 5, $y=6
Dim $Arr[$x][$y]
Dim $msg
; 設定陣列內容
For $i=0 To $x-1
For $j=0 To $y-1
$Arr[$i][$j] = $i*$y+$j
$msg &= $Arr[$i][$j] & @TAB
Next
$msg &= @CRLF
Next
; 顯示陣列內容
MsgBox(4096, "內容", $msg)
結果如下圖所示
上篇文章有提到,在一維陣列時,可以用 UBound 去得知陣列的大小,相同的,這也可以用來多維陣列上。假設要知道第一個維度大小時,UBound 就給它 1 (UBound($Arr, 1)) ;要知道第二個維度大小時就調用 UBound($Arr, 2)。例如:
Dim $Arr[10][20]
$dim1 = UBound($Arr, 1)
$dim2 = UBound($Arr, 2)
MsgBox(4096,"title", $dim1) ; 10
MsgBox(4096,"title", $dim2) ; 20
4. 重新設定大小
二維陣列或多維陣列要重新設定大小和一維方式一樣,但麻煩的事有些洗掉之後就不易得知哪些會保留、哪些不會保留。故若使用多維陣列,重新設定大小時,建議其元素值均需重新給過。
Dim $Arr[2][10]
ReDim $Arr[4][5]
需注意的是,一開始 $Arr 就宣告成二維陣列,於是 ReDim 也一定要是二維陣列,不可是其它維度之陣列。
5. 應用例子
事實上許多線性代數的問題都要用到二維陣列,以下例子即為二維陣列之加法運算,至於減法與除法若有興趣可自行研究。
Dim $A[2][3] = [ [1,2,3],[4,5,6] ]
Dim $B[2][3] = [ [7,8,9],[10,10,10] ]
Dim $C[2][3] ; $C = $A + $B
Dim $msg
For $i=0 To UBound($A, 1)-1
For $j=0 To UBound($A, 2)-1
$C[$i][$j] = $A[$i][$j] + $B[$i][$j]
$msg &= $C[$i][$j] & @TAB
Next
$msg &= @CRLF
Next
MsgBox(4096, "二維陣列內容",$msg)
執行結果如下圖所示。