1、MATLAB 程式設計入門篇異質陣列,張智星jangcs.nthu.edu.twhttp:/www.cs.nthu.edu.tw/jang清大資工系 多媒體檢索實驗室,本章重點,異質陣列(Cell Arrays) MATLAB 在第五版之後才支援的資料型態 主要功能將不同的資料型態儲存於同一個陣列之中本章重點建立異質陣列顯示異質陣列取用異質陣列,異質陣列(Cell Arrays),可儲存各種不同型態的 MATLAB 資料Cell Arrays = 盒子陣列!?異質 = 不同性質的資料型態,建立異質陣列 - Cell Indexing,Ex:cell01.M,A(1,1) = This is t
2、he first cell.;A(1,2) = 5+j*6 , 4+j*5;A(2,1) = 1 2 3; 4 5 6; 7 8 9;A(2,2) = Tim; Chris,Cell-Indexing (cont),上例建立了一個二維異質陣列A:2*2內容如下:,建立異質陣列 - Content Indexing,做法:矩陣() 異質陣列 Ex:cell02.m,A1,1 = this is the first cell.;A1,2 = 5+j*6, 4+j*5;A2,1 = 1 2 3; 4 5 6; 7 8 9;A2,2 = Tim; Chris,結果同上例,建立異質陣列 使用大括號 ,第
3、三種方法是直接用大括號一次把所有元素括起來Ex:, B = James Bond, 1 2;3 4;5 6; pi, magic(5) C = rand(3), ones(2); zeros(5), randperm(4),B =James Bond 3x2 double 3.1416 5x5 doubleC = 3x3 double 2x2 double5x5 double 1x4 double,異值陣列的合併,對於異質陣列的合併,大致上跟陣列合併相同Ex:(B,C如上頁), M = B C% 將異質陣列 B 及 C 左右並排M = James Bond3x2 double3x3 doubl
4、e2x2 double 3.14165x5 double5x5 double1x4 double,異質陣列的內容顯示,直接呼叫?=maybe not若在 MATLAB 指令視窗內,直接呼叫異質陣列的名稱,MATLAB 並不直接顯示異質陣列各元素的值,只能顯示各元素的資料型態及維度Ex: A,Result,A = 1x23 char 1x2 double3x3 double2x1 cell ,Cellplot圖示型態,cellplot 指令可將異質陣列的內部資料型態,以圖形的方式顯示Ex:cell03.m,A1,1 = this is the first cell.;A1,2 = 5+j*6,
5、4+j*5;A2,1 = 1 2 3; 4 5 6; 7 8 9;A2,2 = Tim; Chris;cellplot(A)% 以圖形的方式顯示異質陣列 A 的內部資料型態,Result,celldisp顯示,Ex: celldisp(A)% 顯示異質陣列 A 各個構成元素的實際內容,A1,1 =this is the first cell.A2,1 = 1 2 3 4 5 6 7 8 9A1,2 = 5.0000 + 6.0000i 4.0000 + 5.0000iA2,21 =TimA2,22 =Chris,Content Indexing顯示,先前提過建立異質陣列的方法 - Conten
6、t Indexing,其實也可以用來直接將異質陣列 A 的各個構成元素內容一次全部顯示出來用法:要查看A的內容,在MATLAB下直接輸入: A:% 顯示異質陣列 A 的全部構成元素,Result,ans =this is the first cell.ans =123456789ans =5.0000 + 6.0000i 4.0000 + 5.0000ans = TimChris,異質陣列的內容取用,直接取用異質陣列的cell取用異值陣列的元素的內部構成單位一次同時取用或刪除多個元素異質陣列可以取代以逗點分開的變數列,直接取用異質陣列的cell,以下例子先建立一個異質陣列 B,再取用其中第 1
7、 橫列、第 2 直行的元素:, B = James Bond, 1 2;3 4;5 6; pi, magic(5),B = James Bond 3x2 double 3.1416 5x5 double,p.s.magic(n)可製造nxn大小的魔方陣,直接取用異質陣列的cell (cont), F = B1,2% 取用異質陣列 B 的第 1 橫列、第 2 直行的元素Result:,F =123456,取用異值陣列的元素的內部構成單位,先用 Content Indexing 的方法,再直接加上一般矩陣的索引法Ex: G = B1,2(3,1),G = 5,同時取用或刪除多個元素,如上述異質陣列
8、B, H = B(2,:)%取用異質陣列 B 的第一橫列所有元素H = 3.1416 5x5 double B(1,:) = %刪除異質陣列 B 的第一橫列所有元素B = 3.1416 5x5 double,取代以逗點分開的變數列,Ex: %先建立一個維度為 14 的異質陣列 F = 2 3 5, 1 2 3, Timmy, Annie; F1:2 ans = 2 3 5ans = 1 2 3,取代以逗點分開的變數列,上例中, F1:2 會指向 2 3 5, 1 2 2可將之用於函數的輸入變數列,例如: plot(F1:2, -o)Result:,取代以逗點分開的變數列(cont),同理,亦可
9、將之用於輸出變數列:Ex: F1:2 = max(rand(5),F = 1x5 double 1x5 double%F為一1x2的異質陣列,其他相關指令,改變異質陣列的大小事先預設(Pre-Allocate)空的異質陣列測試某一變數是否為異質陣列將一數值陣列轉換成異質陣列將一結構陣列的所有欄位值轉換成異質陣列將異值陣列轉換為結構陣列將一結構陣列的某一欄位值轉換成異質陣列,改變異質陣列的大小,可使用:運算或reshapeEx:B為2x2異質陣列B = James Bond3x2 double 3.14165x5 doubleResult:, M = B(:)M = James Bond 3.1
10、416 3x2 double 5x5 double, N = reshape(B,1,4)N = James Bond 3.1416 3x2 double 5x5 double,預設空的異質陣列,利用 cell 指令Ex: E = cell(4, 3)% 事先預設一個 43 空的異質陣列Result:,E = ,測試某變數是否為異質陣列,可用iscell 指令Ex:iscell01.m,C = 1,2,3; This is a test.;iscell(C),ans = 1,上例中,iscell 的執行結果是傳回值 1,代表變數 A 是一個異質陣列,若傳回值 0,則代表不是異質陣列。,將數值陣
11、列轉換成異質陣列,num2cell 指令可將一數值陣列轉換成異質陣列, 其使用語法為:C = num2cell(A, dim)其中 dim 是代表 被切割的維度,若不指定,則將每個元素視為異質陣列裡面的一個 11 矩陣,將數值陣列轉換成異質陣列(cont),Ex:num2cell01.m,A = 1 2 3;4 5 6;% 建立一個數值陣列 AC = num2cell(A)% 將數值陣列 A 轉成異質陣列 C,C = 1 2 3 4 5 6,將數值陣列轉換成異質陣列(cont),可以將上例數值陣列 A 中的每一直行, 轉成異質陣列 D 的元素Ex::num2cell02.m,A = 1 2 3
12、;4 5 6;% 建立的一個數值陣列 AD = num2cell(A, 1)% 1 代表橫列被切割,D = 2x1 double 2x1 double 2x1 double,將數值陣列轉換成異質陣列(cont),也可以將數值陣列 A 的每一橫列, 轉成異質陣列 E 的元素Ex:num2cell03.m,A = 1 2 3;4 5 6;% 建立的一個數值陣列 AE = num2cell(A, 2)% 2 代表直行被切割,E = 1x3 double1x3 double,將結構陣列轉換成異質陣列,struct2cell 指令可將一結構陣列的所有欄位值轉換成異質陣列。Ex:struct2cell01
13、.m,student.name = Tim;student.age = 8;%student為一structsCell = struct2cell(student),sCell = Tim 8,將異值陣列轉換為結構陣列,另外有一個 cell2struct 指令可以將異值陣列轉換為結構陣列詳細說明請參考本書的下一章結構陣列。,將結構陣列的某一欄位值轉換成異質陣列,使用 deal 指令Ex:deal01.m,S = struct(name,Tim,Annie,age, 8,5); sCell1:length(S) = deal(S.name),sCell = Tim Annie,deal 指令,d
14、eal 指令的輸入及輸出引數需有相同個數如上例中,sCell1:length(S) 的作用即是產生以逗點分開的輸出變數列。善用 deal 指令,可達成事半功倍之效,以下欲列出 MATLAB 根目錄下所有目錄(不含檔案),Ex:deal02.m,dirInfo = dir(matlabroot);% 列出 MATLAB 的根目錄的各種資訊n = length(dirInfo);% 檔案及目錄的個數fileAndDir1:n = deal(dirInfo.name);% fileAndDir 包含檔案及目錄名稱dirs = fileAndDir(dirInfo.isdir)% dirs 包含各目錄名稱,Result,dirs = Columns 1 through 10. .bindemosexternhelpjajavanotebookrtwColumns 11 through 17simulinkstateflowsystoolboxuninstallwebserverwork,本章指令彙整,