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)

結果如下圖所示

AutoIt!! 多維陣列-000.png 

上篇文章有提到,在一維陣列時,可以用 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)

執行結果如下圖所示。

AutoIt!! 多維陣列-001.png 

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()