1. 程式人生 > >MATLAB的cell陣列

MATLAB的cell陣列

5  Cell陣列元胞陣列(cell)是MATLAB的一種特殊資料型別。可以將元胞陣列看做一種無所不包的通用矩陣,或者叫做廣義矩陣。組成元胞陣列的元素可以是任何一種資料型別的常數或者常量,每一個元素也可以具有不同的尺寸和記憶體佔用空間,每一個元素的內容也可以完全不同。和一般的數值矩陣一樣,元胞陣列的記憶體空間也是動態分配的。圖3-3是元胞陣列的結構示意圖,表示的是一個2´3的元胞陣列。元胞陣列的第1行包括了無符號整數、字串陣列和一個複數陣列,第2行包括了其他3種類型的陣列,其中最後一個是另外的元胞陣列的巢狀。圖3-3  元胞陣列結構示意圖和數值陣列一樣,元胞陣列的維數不受限制,元胞陣列可以是一維的、二維的,也可以是多維的。對元胞陣列的元素進行尋訪,可以使用“單下標”方式或者“全下標”方式。結構陣列和元胞陣列有著非常相似的功能,但是二者又有所區別,具體比較如下。結構陣列和元胞陣列在使用目的上類似,都是提供一種儲存混合格式資料的方法。二者最大的區別在於:結構陣列儲存資料的容器稱做“域”,而元胞陣列是通過數字下標索引來進行訪問的。結構陣列經常用於重要資料的組織儲存。而元胞陣列因為採用數字下標,所以經常在迴圈控制流中使用。元胞陣列還常被用來儲存不同長度的字串。在實際應用中,二者一般可以隨意選擇,多數情況下無論選用其中哪一種型別都可以達到目的,使用者可以根據自己的習慣和實際應用來決定。5.1  Cell陣列的建立組成元胞陣列的資料可以是任意型別的資料,所以在建立元胞陣列之前需要建立相應的資料。本小節結合具體的例項介紹建立元胞陣列的方法。在表現形式上,元胞陣列和一般矩陣一樣,元胞陣列的尺寸也必須是長方形的。一般矩陣的建立使用中括號" [ ] “,而元胞陣列使用的是花括號”{ }"。元胞陣列的建立方式同矩陣的建立方式類似,只需要將中括號" [ ] “替換為花括號”{ }“即可。在元胞陣列建立的過程中使用逗號或者空格來分隔元素,使用分號來分行。【例3-21】  建立元胞陣列示例。>> A = {[1 4 3; 0 5 8; 7 2 9], ‘Anne Smith’; 3+7i, -pi:pi/4:pi};>> AA =    [3x3 double]    ‘Anne Smith’    [3.0000 + 7.0000i]    [1x9 double]本例中元胞陣列A的第一個元素是一個數值矩陣,矩陣的輸入只需要使用正常的中括號” [ ] "即可。而第一行第二列字串也是正常使用單引號即可。【例3-22】  巢狀元胞陣列建立示例。(1)直接建立巢狀元胞陣列,只需要將內層和外層的元胞陣列都用花括號括起來即可。>> header = {‘Name’, ‘Age’, ‘Pulse/Temp/BP’};    %  元胞陣列的建立>> records(1,:) = {‘Kelly’, 49, {58, 98.3, [103, 72]}};%  巢狀元胞陣列的建立>> header, recordsheader =    ‘Name’    ‘Age’    'Pulse/Temp/BP’records =    ‘Kelly’    [49]    {1x3 cell}(2)通過分步來建立元胞陣列則更加清楚明瞭。>> vitalsigns = {60, 98.4, [105, 75]};>> records(1,:) = {‘Kelly’, 49, vitalsigns}%  將元胞陣列vitalsigns巢狀進recordsrecords =    ‘Kelly’    [49]    {1x3 cell}【例3-23】  依次建立元胞陣列示例。使用者還可以通過每次建立一個元胞的方式,依次建立元胞陣列,MATLAB會根據表示式依次對原有的元胞陣列進行擴充套件,從而建立新的元胞陣列。例如:>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};>> A(1,2) = {‘Anne Smith’};>> A(2,1) = {3+7i};>> A(2,2) = {-pi:pi/4:pi};如果使用者對超出陣列尺寸的元胞進行賦值,那麼MATLAB就會自動擴充套件至新的尺寸,以將新賦的值包括進來。例如將上面的A由2´2擴充套件為3´3,可以使用如下命令:>> A(3,3) = {5};擴充套件之後的元胞陣列A示意圖如圖3-4所示。圖3-4  元胞陣列A示意圖除了上面所講的方法之外,MATLAB還提供了一個專門的函式來建立元胞陣列,即cell函式。cell函式用於建立一維、二維或者多維空元胞陣列。【例3-24】  建立空元胞陣列示例。>> a=cell(1)a =    {[]}>> b=cell(3,3)b =     []     []     []     []     []     []     []     []     []>> c=cell(2,2,2)c(:,:,1) =     []     []     []     []c(:,:,2) =     []     []     []     []>> whos  Name      Size             Bytes  Class    Attributes  a         1x1                  8  cell                 b         3x3                 72  cell                 c         2x2x2               64  cell               使用cell函式建立空元胞陣列的主要目的,是為陣列預先分配連續的儲存空間,節約記憶體佔用,提高執行的效率。5.2  Cell陣列的尋訪元胞陣列的尋訪和一般陣列的尋訪類似,但是情況更為複雜。對於二維陣列A來說,A(2,4)表示的就是陣列第2行第4列上的元素。但是對域元胞陣列來說就不這麼簡單了。在元胞陣列中,元胞和元胞裡的內容是兩個不同範疇的東西。因此,尋訪元胞和元胞中的內容是兩種不同的操作。為尋訪不同的內容MATLAB設計了兩種不同尋訪的方法:“元胞外標識(cell indexing)”和“元胞內編址(Content addressing)”。以元胞陣列A為例,A(2,4)指的是元胞陣列中的第2行第4列的元胞元素,而A{2,4}指的則是元胞陣列中的第2行第4列的元胞內容。注意:這兩種方式的區別僅在於使用的括號不同。【例3-25】  元胞陣列的尋訪示例。>> a={20,‘matlab’;ones(2,3),1:3}a =    [        20]    ‘matlab’        [2x3 double]    [1x3 double]>> str=a{1,2}       %  返回字元型陣列str,a{1,2}表示對應元胞的內容str =matlab>> class(str)       %  檢視變數str的資料型別,結果確為字元型ans =char>> str2=a(1,2)      %  a(1,2)表示元胞陣列中的一個元胞str2 =    ‘matlab’>> class(str2)      %  檢視變數str2的資料型別,結果為元胞陣列ans =cell