1. 程式人生 > >MATLAB使用和學習筆記01:Cell陣列

MATLAB使用和學習筆記01:Cell陣列

關於cell陣列

元胞陣列最有用的地方在於,它可以在一個數組中的每個元胞裡,儲存不同的資料型別。就像人的身體裡可以有神經元細胞,血紅細胞等等,他們型別不同,但是統稱細胞並共存在人體中。 元胞陣列對於讀取,處理和寫入格式複雜的資料檔案非常有用。

1. Cell的建立

  1. Cell = {1,2,3; ’abc’,[1:13],4.567}; %直接賦值,適用於元素不多的情況
  2. Cell = {}; %(建立空的元胞陣列,以備用)
  3. Cell = {3,4,2}; %(同上,建立固定大小的空陣列備用)
  4. for i = 1 : 35 Cell{i,1} = i; end (注:這種方式會被提示Cell陣列的大小一直在變,但若你無法事先估計Cell所要儲存的資料大小,這種方式可以一試。)

2. Cell 的訪問

基本的呼叫方式如下:

大括號{}:

  1. A = Cell{1,2};

假設Cell{1,2} 為一個一維陣列:[1,2,3,4,5],想調取該陣列的第4位資料:

  1. A = Cell{1,2}{4}

假設Cell 是一個1X5的陣列,且這5個cell中的資料均為同類型,如:

  1. Cell = {1,2,3,4,5}; A = [Cell{1,1:5}]; %則結果為陣列,即: A = [1 2 3 4 5]

注意: 1)這裡給A賦值時,cell外一定要加方括號[],不=否則只會將第一位資料賦給A。 2)若這5個cell中的資料型別均為字元,則上述命令所獲得的A是一個字串。(也可以用strjoin函式)

下面的例子來自Mathwork:

C = {‘one’, ‘two’, ‘three’; 1, 2, 3} C = 2x3 cell array {‘one’} {‘two’} {‘three’} {[ 1]} {[ 2]} {[ 3]}

在本例中,若賦值:

[r1c1, r2c1, r1c2, r2c2] = C{1:2,1:2} %則結果為: r1c1 = ‘first’ r2c1 = 1 r1c2 = ‘second’ r2c2 = 2

這個例子說明,賦值的順序是按照列來的,先第一列再第二列,以此類推。

小括號() 圓括號並不直接呼叫Cell中的內容,它調取的是位置,是cell的索引。換句話說,{}傳遞的是cell中資料本來的型別,cell中的資料是float型,它就傳float;是string,它就傳string。而()傳遞的是cell型別。對比:

C = {1,2,3,4,5} C = 1×5 cell 陣列 [1] [2] [3] [4] [5] A = [C{1,1:2}] A = 1 2

以及:

A = C(1:2) A = 1×2 cell 陣列 [1] [2]

要利用()給cell賦值,也不能直接像對{}這樣:~~Cell(1,1) = 5; ~~ 而是:Cell(1,1) = {5}; 因為等式左()呼叫的是位置,右{}表示該位置Cell的內容。 此外,凡呼叫引數為cell陣列的函式,傳參時也必須用()而不是{},原因同理。

3. 為Cell預分配記憶體(Mathwork)

元胞陣列不需要完全連續的記憶體。但是,每個元胞都要求連續的記憶體,與 MATLAB® 建立用於描述陣列的元胞陣列頭一樣。對於大型陣列,以遞增方式增加元胞的數量或元胞中元素的數量會導致 Out of Memory 錯誤。(所以儘量不要用<Cell建立>中的第四種賦值方式,但如果你不能確定大型陣列的行列數,就沒有辦法了……)

通過呼叫 cell 函式或分配給最後一個元素,來初始化元胞陣列。例如,以下語句是等效的:

C = cell(25,50); C{25,50} = [];

4. 刪除Cell,合併Cell

例如:

C{1,4} = []; %只刪除該cell中的元素,位置保留。 C(1,4) = []; %刪除該cell中第四個位置,第五位cell前移。

下面這個例子來自Mathwork:

C1 = {1, 2, 3}; C2 = {‘A’, ‘B’, ‘C’}; C3 = {10, 20, 30}; %使用陣列串聯運算子 [] 串聯元胞陣列。在此示例中,通過使用分號分隔元胞陣列來垂直串聯元胞陣列:

C4 = [C1; C2; C3] C4 是一個 3×3 元胞陣列: C4 = [ 1] [ 2] [ 3] ‘A’ ‘B’ ‘C’ [10] [20] [30]

%使用元胞陣列構造運算子 {} 建立一個巢狀元胞陣列: C5 = {C1; C2; C3}

%C5 是一個 3×1 元胞陣列,其中每個元胞都包含一個元胞陣列: C5 = {1x3 cell} {1x3 cell} {1x3 cell}

5. Cell常用的函式

  1. cell2mat/mat2cell:

C = mat2cell(A,dim1Dist,…,dimNDist) C = mat2cell(A,rowDist)

注意,dimDist,rowDist都是一維陣列且必須是陣列!陣列的長度代表你在這個維度要劃分的cell格數。陣列中元素的值代表一個cell格子內在這個維度可分的格數。舉個兩例子,想把陣列轉化成1X3的cell,每個cell裡為則:

C = mat2cell(A, ones(1,3)) ; %則A至少要有3行 C = mat2cell(A, [1,2,3]) ; %則A至少要有6行

  1. cellstr:

C = cellstr(A) 將 A 轉換為字元向量元胞陣列。輸入陣列 A 可以是字元陣列或分類陣列,從 R2016b 開始,也可以是字串陣列。

  1. num2cell: (略)

  2. strsplit:

C = strsplit(str) 在空白處將 str 拆分為 C。空白字元等效於集合 {’ ‘,’\f’,’\n’,’\r’,’\t’,’\v’} 中的任何轉義序列。