多維陣列
本 章 重 點
MATLAB 第四版只支援一維陣列(即向量)及二 維陣列(即矩陣) ,但自從 MATLAB 第五版之後,
開始支援數種新的資料型態,包含多維陣列、異質
陣列、及結構陣列。本章及隨後數章將一一介紹這
些 新 的 資 料 型 態 。 善 用 這 些 資 料 型 態 , 您 的
MATLAB 程式將會變成百米選手的短褲—又快又
短喔!
MATLAB 程式設計與應用
12-1 多維陣列的定義
在 MATLAB 的資料型態中,向量可視為一維陣列,矩陣可視二維陣 列,對於維度超過 1 的陣列則均可視為多維陣列(Multidimesional Arrays,簡稱 N-D Arrays),以下分別以二維陣列、三維陣列、及四 維陣列說明之。
二維陣列有兩個維度(Dimensions),分別是「橫列(Row)」與「直 行(Column)」,或分別簡稱為「列」與「行」,可以 (列,行)為 之。以 維度為 3 個橫列及 4 個直行(表示為 3×4)的二維陣列為例,
其定址方式可圖示如下:
前述的二維陣列,可對應至一個 x - y 二維平面座標,圖示如下:
(1,1) (1,2) (1,3) (1,4) (2,1) (2,2) (2,3) (2,4) (3,1) (3,2) (3,3) (3,4)
直行
橫 列
Y(行)
X(列)
將二維陣列逆時鐘旋轉 90 度,即可得到類似於一般 x - y 二維平面座標的表示 法。
在 MATLAB 中,可將兩個二維陣列疊在一起,就形成第三個維度,
此第三個維度稱為「頁」(Page),圖示如下:
前述的三維陣列,可對應至一個 x - y - z 三維立體座標,,圖示如下:
Z(頁)
Y(行) X(列)
頁 (1,1) (1,2) (1,3) (1,4) (2,1) (2,2) (2,3) (2,4) (3,1) (3,2) (3,3) (3,4) (1,1) (1,2) (1,3) (1,4)
(2,1) (2,2) (2,3) (2,4)
(3,1) (3,2) (3,3) (3,4) 頁 列
行
MATLAB 程式設計與應用
因此對於三維陣列定址,可以(列,行,頁)為之。以維度為 3×4×2 的 三維陣列為例,其定址方式可圖示如下:
上例中,陣列 A 是三維陣列,其中 A(:,:,1)代表第一頁的二維陣列,
A(:,:,2)代表第二頁的二維陣列。
四維陣列的第四個維度可稱為「箱」(Box),而每一箱是由一個三 維陣列所組成,其定址方式可以(列,行,頁,箱)為之。舉例來說,一 個 2×2×3×5 的四維陣列,可表示成 5 個箱,每一個箱都是由一個 2
×2×3 的三維陣列所組成,圖示如下:
由此可類推至 n 維陣列,n 為任意自然數。
入,例如:
>> A = [1 0 2 5; 4 1 8 7; 3 2 6 3];
>> A(:,:,2) = [3 5 4 1; 2 6 2 1; 4 2 3 0]
A(:,:,1) =
1 0 2 5 4 1 8 7 3 2 6 3 A(:,:,2) =
3 5 4 1 2 6 2 1 4 2 3 0
在上例中,是先建立一個二維陣列 A ,再輸入第二頁的二維陣列 A(:,:,2) ,依此方式逐頁輸入二維陣列的內容,即可建立三維陣列。
亦可只輸入一個元素,MATLAB 會將未指定之部分直接設定為 0 ,例 如:
>> A(2,1,3) = 5 A(:,:,1) =
1 0 2 5 4 1 8 7 3 2 6 3 A(:,:,2) =
3 5 4 1 2 6 2 1 4 2 3 0 A(:,:,3) =
0 0 0 0 5 0 0 0
MATLAB 程式設計與應用
我們也可以使用 MATLAB 第五版新增的純量展開(Scalar Expansion)
的功能,直接設定一個純量給多維陣列的一頁,例如:欲將陣列 A 的 第二頁的所有元素設為 7,可輸入:
>> A(:,:,2) = 7 A(:,:,1) =
1 0 2 5 4 1 8 7 3 2 6 3 A(:,:,2) =
7 7 7 7 7 7 7 7 7 7 7 7 A(:,:,3) =
0 0 0 0 5 0 0 0 0 0 0 0
對於較複雜的多維陣列,可用 cat 指令來建立,其功能為「並排」數 個陣列,並可指定「並排」時所用的維度,其指令格式如下:
Z = cat(dim, A, B, C… )
其中 A、B、C 為陣列,dim 是將 A、B、C… 合併時所用到的維度。
例如:欲將矩陣 A 與 B 上下(垂直)並排,可輸入:
>> A = [1 2; 3 4];
>> B = [1 0; 0 1];
>> Z = cat(1, A, B) % 數字 1 表示將陣列 A 與 B 上下垂直並排 Z =
1 2 3 4 1 0 0 1
1 2 1 0 3 4 0 1
若欲將陣列 A 與 B 疊起來,以得到一個三維陣列,可輸入:
>> Z = cat(3, A, B) % 數字 3 表示將陣列 A 與 B 重疊排成三維陣列 Z(:,:,1) =
1 2 3 4 Z(:,:,2) = 1 0 0 1
若 所 設 定 的 dim 值 比 陣 列 A 、 B 、 C… 的 各 自 原 先 的 維 度 數
(Dimensionality)還要超出 2 或更多,則 MATLAB 會自動補上大小 為 1 的維度,例如:
>> Z = cat(4, [1 3; 2 4], [1 2; 1 1]) Z(:,:,1,1) =
1 3 2 4 Z(:,:,1,2) = 1 2 1 1
此時陣列 Z 的維度變為 2×2×1×2。
MATLAB 亦可產生特殊用途的多維陣列,例如:若要產生一個維度是 2×3×5 的亂數陣列,可用 rand 指令:
>> A = rand(2, 3, 5)
MATLAB 程式設計與應用
A(:,:,1) =
0.3412 0.7271 0.8385 0.5341 0.3093 0.5681 A(:,:,2) =
0.3704 0.5466 0.6946 0.7027 0.4449 0.6213 A(:,:,3) =
0.7948 0.5226 0.1730 0.9568 0.8801 0.9797 A(:,:,4) =
0.2714 0.8757 0.1365 0.2523 0.7373 0.0118 A(:,:,5) =
0.8939 0.2987 0.2844 0.1991 0.6614 0.4692
類似的指令,還有 randn、ones、zeros 等用來產生特殊用途的矩陣,
詳見本書第十章「矩陣的處理與運算」的第二節「特殊用途矩陣」。