Download presentation
Presentation is loading. Please wait.
1
張智星 (Roger Jang) jang@mirlab.org http://mirlab.org/jang 台大資工系 多媒體檢索實驗室
MATLAB 程式設計 多維陣列 張智星 (Roger Jang) 台大資工系 多媒體檢索實驗室
2
11-1 多維陣列的定義 在 MATLAB 的資料型態中: 一維陣列稱為向量(Vectors) 二維陣列稱為矩陣(Matrices)
維度(Dimensions)超過 1 的陣列則均可視為「多維陣列」(Multidimesional Arrays,簡稱 N-D Arrays)。
3
二維陣列 (I) 二維陣列又簡稱矩陣,具有兩個維度 橫列(Row) 直行(Column) 直行 (1,1) (1,2) (1,3)
(1,4) (2,1) (2,2) (2,3) (2,4) (3,1) (3,2) (3,3) (3,4) 橫列
4
二維陣列 (II) 二維陣列可對應至一個 X-Y 二維平面座標,圖示如下: Y(行) X(列)
5
三維陣列 (I) 將兩個矩陣疊在一起,就形成第三個維度,此第三個維度可稱為「頁」(Page),圖示如下: (1,1) (1,2) (1,3)
(1,4) (2,1) (2,2) (2,3) (2,4) (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) 列 頁 行
6
三維陣列 (II) 三維陣列可對應至一個 X - Y - Z 三維立體座標,圖示如下: Y(行) X(列) Z(頁)
7
三維陣列 (III) 三維陣列定址,可以 (列,行,頁) 定之。 以維度為 3×4×2 的三維陣列為例,其定址方式可圖示如下:
陣列 A 是三維陣列,其中 A(:,:,1)代表第一頁的二維陣列,A(:,:,2)代表第二頁的二維陣列。
8
四維陣列 四維陣列的第四個維度可視為「箱」(Box),而每個箱是由一個三維陣列所組成,其定址方式為 (列,行,頁,箱)。
例如:一個 2×2×3×5 的四維陣列,可表示成 5 個箱,每個箱都由一個 2×2×3 的三維陣列所組成,圖示如下: 依此可類推至 n 維陣列,n 為任意自然數。
9
11-2 多維陣列的建立 欲建立一個簡單的多維陣列,可直接由 MATLAB 指令視窗內輸入 範例11-1:mDim01.m
A(:,:,2) =
10
多維陣列直接設定 範例11-2 (I) 上例是先建立一個二維陣列 A ,再輸入第二頁的二維陣列 A(:,:,2) ,如此逐頁輸入二維陣列的內容,即可建立三維陣列。 如果直接設定某一個新頁的一個元素值,此時MATLAB 會將此頁其他未指定之元素直接設定為 0 ,範例如下:
11
多維陣列直接設定 範例11-2 (II) 範例11-2:mDim02.m A = [1 0 2 5; 4 1 8 7; 3 2 6 3];
A(:,:,2) = A(:,:,3) =
12
純量展開功能 (Scalar Expansion) (I)
MATLAB 第五版新增純量展開 (Scalar Expansion) 功能,直接設定一個純量給多維陣列的一頁。 承接上述範例,若要將陣列 A 的第二頁所有元素設為 7,可輸入如下:
13
純量展開功能 (Scalar Expansion) (II)
A(:,:,2) = A(:,:,3) =
14
垂直並排多維陣列 範例11-3 (I) 對於較複雜的多維陣列,可用 cat 指令來建立,其功能為「並排」數個陣列,並可指定「並排」時所用的維度 其指令格式如下: Z = cat(dim, A, B, C…) A、B、C 為陣列 dim 是將 A、B、C… 合併時所用到的維度。(亦即在合併後,此維度的大小會改變。)
15
垂直並排多維陣列 範例11-3 (II) 欲將矩陣 A 與 B 上下(垂直)並排 範例11-3:cat01.m
Z = cat(1, A, B) % 數字 1 表示將陣列 A 與 B 上下垂直並排 Z =
16
水平並排多維陣列 範例11-4 欲將陣列 A 與 B 左右(水平)並排 範例11-4:cat02.m A = [1 2; 3 4];
Z = cat(2, A, B) % 數字 2 表示將陣列 A 與 B 左右水平並排 Z =
17
陣列堆疊 – 範例11-5 將陣列 A 與 B 疊起來,得到一個三維陣列 範例11-5:cat03.m A = [1 2; 3 4];
Z = cat(3, A, B) % 數字3表示將陣列 A 與 B 重疊排成三維陣列 Z(:,:,1) = Z(:,:,2) =
18
cat自動補齊維度 – 範例11-6 所設定的 dim 值比陣列 A、B、C…的各自原先的「維度數」(Dimensionality)還要超出 2 或更多,MATLAB 會自動補上大小為 1 的維度 此時陣列 Z 的維度變為 2×2×1×2 範例11-6:cat04.m A = [1 2; 3 4]; B = [1 0; 0 1]; Z = cat(4, A, B) % 數字 4 表示將陣列 A 與 B 放在相鄰的兩「箱」 Z(:,:,1,1) = Z(:,:,1,2) =
19
亂數陣列 (I) MATLAB 可產生特殊用途的多維陣列 要產生一個維度是 2×3×5 的亂數陣列,可用 rand 指令
>> A = rand(2, 3, 5) A(:,:,1) = A(:,:,2) =
20
亂數陣列 (II) 類似的指令,詳見本書第九章「矩陣的處理與運算」的第二節「特殊用途矩陣」 A(:,:,3) =
A(:,:,4) = A(:,:,5) = 類似的指令,詳見本書第九章「矩陣的處理與運算」的第二節「特殊用途矩陣」
21
11-3 多維陣列的數學運算 許多用於向量和矩陣的數學運算,例如 sum、max、min、mean 等,也都可以用在多維陣列。
在使用這些指令時,我們必須指定這些指令的操作是在哪一個維度。
22
多維陣列運算 維度指定 範例11-7 (I) 範例11-7:sum01.m A = [1 1 1 1; 2 2 2 2; 3 3 3 3];
B = [ ; ; ]; Z = cat(3, A, B); % 將矩陣 A, B 疊成一個三維陣列 S = sum(Z, 1) % 根據第一維度來對元素進行相加 size(S) S(:,:,1) = S(:,:,2) = ans =
23
多維陣列運算 維度指定 範例11-7 (II) 上述範例,矩陣 Z 的大小是 3×4×2,sum(Z, 1) 是根據第一個維度來進行相加,因此第一個維度值就會被被壓成是 1,因此 size(S) 所傳回的值是 [1, 4, 2],代表矩陣 S 的大小是 1×4×2 sum(Z) 的預設相加維度即是 1,因此 sum(Z) 和 sum(Z, 1) 所得到的結果是一樣的。
24
多維陣列運算 維度指定 範例11-8 (I) 對第二個維度進行相加,可見下列範例。 範例11-8:sum02.m
A = [ ; ; ]; B = [ ; ; ]; Z = cat(3, A, B); % 將矩陣 A, B 疊成一個三維陣列 S = sum(Z, 2) % 根據第二維度來對元素進行相加 size(S) S(:,:,1) = 4 8 12
25
多維陣列運算 維度指定 範例11-8 (II) 在上述範例中,sum(Z, 2)是對第二個維度進行相加運算,因此所傳回的矩陣 S 的維度是 3×1×2。 sum(z, 3) 的結果請依此類推。 S(:,:,2) = 4 10 ans =
26
Quiz An array Z can be created by the following statements:
What are the sizes of the returned arrays of the following statements? sum(Z, 1) 1 4 2 sum(Z, 2) 3 1 2 sum(Z, 3) or 3 4 A = [ ; ; ]; B = [ ; ; ]; Z = cat(3, A, B);
27
sum的累加–範例11-9 (I) 執行sum(Z)時,如果預設要相加的維度只有單一維度,那麼 sum 指令會對下一個維度進行相加的動作,
sum(sum(Z)) 將會得到三維陣列 Z 的每一頁的總和。 sum(sum(sum(Z))) 或 sum(Z(:)) 可得到三維陣列 Z 的總和。
28
sum的累加–範例11-9 (II) 範例11-9:sumSum01.m 與 sum 類似的指令還有 max、min、mean、median、mode、std、diff、sort 等,可以參考第九章的第三小節「矩陣的數學運算」。 A = [ ; ; ]; B = [ ; ; ]; Z = cat(3, A, B); % 將矩陣 A, B 疊成一個三維陣列 S = sum(sum(Z)) S(:,:,1) = 24 S(:,:,2) = 14
Similar presentations