元胞陣列索引 MATLAB的cell陣列

2021-10-14 20:02:51 字數 3452 閱讀 7280

5  cell陣列

元胞陣列(cell)是matlab的一種特殊資料型別。可以將元胞陣列看做一種無所不包的通用矩陣,或者叫做廣義矩陣。組成元胞陣列的元素可以是任何一種資料型別的常數或者常量,每乙個元素也可以具有不同的尺寸和記憶體占用空間,每乙個元素的內容也可以完全不同。和一般的數值矩陣一樣,元胞陣列的記憶體空間也是動態分配的。圖3-3是元胞陣列的結構示意圖,表示的是乙個2´3的元胞陣列。元胞陣列的第1行包括了無符號整數、字串陣列和乙個複數陣列,第2行包括了其他3種型別的陣列,其中最後乙個是另外的元胞陣列的巢狀。

圖3-3  元胞陣列結構示意圖

和數值陣列一樣,元胞陣列的維數不受限制,元胞陣列可以是一維的、二維的,也可以是多維的。對元胞陣列的元素進行尋訪,可以使用「單下標」方式或者「全下標」方式。

結構陣列和元胞陣列有著非常相似的功能,但是二者又有所區別,具體比較如下。

結構陣列和元胞陣列在使用目的上類似,都是提供一種儲存混合格式資料的方法。二者最大的區別在於:結構陣列儲存資料的容器稱做「域」,而元胞陣列是通過數字下標索引來進行訪問的。

結構陣列經常用於重要資料的組織儲存。而元胞陣列因為採用數字下標,所以經常在迴圈控制流中使用。元胞陣列還常被用來儲存不同長度的字串。

在實際應用中,二者一般可以隨意選擇,多數情況下無論選用其中哪一種型別都可以達到目的,使用者可以根據自己的習慣和實際應用來決定。

5.1  cell陣列的建立

組成元胞陣列的資料可以是任意型別的資料,所以在建立元胞陣列之前需要建立相應的資料。本小節結合具體的例項介紹建立元胞陣列的方法。

在表現形式上,元胞陣列和一般矩陣一樣,元胞陣列的尺寸也必須是長方形的。一般矩陣的建立使用中括號" [ ] ",而元胞陣列使用的是花括號""。元胞陣列的建立方式同矩陣的建立方式類似,只需要將中括號" [ ] "替換為花括號""即可。在元胞陣列建立的過程中使用逗號或者空格來分隔元素,使用分號來分行。

【例3-21】  建立元胞陣列示例。

>> a = ;

>> a

a =

[3x3 double]    'anne smith'

[3.0000 + 7.0000i]    [1x9 double]

本例中元胞陣列a的第乙個元素是乙個數值矩陣,矩陣的輸入只需要使用正常的中括號" [ ] "即可。而第一行第二列字串也是正常使用單引號即可。

【例3-22】  巢狀元胞陣列建立示例。

(1)直接建立巢狀元胞陣列,只需要將內層和外層的元胞陣列都用花括號括起來即可。

>> header = ;    %  元胞陣列的建立

>> records(1,:) = };%  巢狀元胞陣列的建立

>> header, records

header =

'name'    'age'    'pulse/temp/bp'

records =

'kelly'    [49]    

(2)通過分步來建立元胞陣列則更加清楚明了。

>> vitalsigns = ;

>> records(1,:) =

%  將元胞陣列vitalsigns巢狀進records

records =

'kelly'    [49]    

【例3-23】  依次建立元胞陣列示例。

使用者還可以通過每次建立乙個元胞的方式,依次建立元胞陣列,matlab會根據表示式依次對原有的元胞陣列進行擴充套件,從而建立新的元胞陣列。例如:

>> a(1,1) = ;

>> a(1,2) = ;

>> a(2,1) = ;

>> a(2,2) = ;

如果使用者對超出陣列尺寸的元胞進行賦值,那麼matlab就會自動擴充套件至新的尺寸,以將新賦的值包括進來。例如將上面的a由2´2擴充套件為3´3,可以使用如下命令:

>> a(3,3) = ;

擴充套件之後的元胞陣列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列的元胞內容。注意:這兩種方式的區別僅在於使用的括號不同。

【例3-25】  元胞陣列的尋訪示例。

>> a=

a =

[        20]    'matlab'    

[2x3 double]    [1x3 double]

>> str=a       %  返回字元型陣列str,a表示對應元胞的內容

str =

matlab

>> class(str)       %  檢視變數str的資料型別,結果確為字元型

ans =

char

>> str2=a(1,2)      %  a(1,2)表示元胞陣列中的乙個元胞

str2 =

'matlab'

>> class(str2)      %  檢視變數str2的資料型別,結果為元胞陣列

MATLAB元胞陣列

元胞陣列是matlab的一種特殊資料型別,可以將元胞陣列看做一種無所不包的通用矩陣,或者叫做廣義矩陣。組成元胞陣列的元素可以是任何一種資料型別的常數或者常量,每乙個元素也可以具有不同的尺寸和記憶體占用空間,每乙個元素的內容也可以完全不同,所以元胞陣列的元素叫做元胞 cell 和一般的數值矩陣一樣,元...

matlab胞元陣列

今天敲matlab 的時候,用bwboundaries函式來提取影象邊界的 中出現了d b這句 這句 的意思是將邊影象中第乙個物件的所有邊界座標提取出來 覺得這種表達形式很有意思,查了查資料是元胞陣列的利用。元胞陣列裡面可以是任意結構的陣列 任意大小,任意型別 是一種很方便的結構,這樣你就可以把亂七...

Matlab中的元胞陣列

元胞陣列 cell array 將型別不同的相關資料整合到乙個單一的變數中,使得大量相關資料的引用和處理變得簡單方便。也就是說cell元胞陣列,儲存不同型別的資料。建立方法有3種 直接賦值法 利用函式cell 利用直接建立元胞陣列的所有單元。通過賦值語句把值賦到元胞陣列的乙個單元中,但每一次賦值只能...