前言
在編寫MATLAB程序時,我們可以不指定變量的數據類型。這使得MATALB編程很接近演算紙式的科學計算。當然,這也造成使用者往往忽略了MATLAB中的數據類型。了解MATLAB中的數據類型,可以更好的幫助我們進行MATALB編程。
在MATLAB編程中,常用的基本數據類型有:
(1) logical(邏輯);(2) char(字符);(3) numeric(數值);(4) cell(元胞);(5) struct(結構體);(6) function handle(函數句柄)。
對於有C語言基礎的使用者來說,前面3種基本數據類型是很熟悉的,后面3種基本數據類型則需要進一步的了解。本文章將講述cell(元胞)類型,該類型在復雜編程中常被使用。
正文
元胞是一個很獨特的數據類型。與其他數據類型不同,它可以存儲任意類型的數據,例如邏輯型、字符型和數值型等,甚至是元胞型。
那么,你可能會聯想到元胞數組可以同時存儲不同類型和大小的數據。答案當然是肯定,這就是元胞數組最大的特點。這里你可能會有疑問,數組的每一個元素不應該是同一類型的嘛,這是不是違反了這一點?其實並沒有,元胞數組每一個元素都是元胞類型,這正好符合上述特性。而每一個元胞都可以存儲任意類型的數據,才形成了元胞數組可以同時存儲不同類型的數據。
1. 元胞數組的創建
- 使用符號{ }來創建
% 2x3的元胞數組
C = {true, 2, 'text'; [], rand(5, 10, 2), {11; 22; 33}}
代碼運行結果如下。生成了2x3的元胞數組C,其中分別包含了邏輯型、數值型、字符數組、空數組、三維數組、元胞數組。

- 使用函數cell()來創建
% 3x3的元胞數組
C1 = cell(3)
% 3x3的元胞數組
C2 = cell(3,2)
代碼運行結果如下。分別生成了3x3的元胞數組和3x2的元胞數組,其中每個元胞存儲的內容都是空數組。

2. 元胞數組的尋訪
元胞數組的尋訪有下面兩種情況,一種是用()尋訪元胞數組的內容,即元胞;另一種是用{}尋訪元胞數組中元胞的內容。
C = {true, 2, 'text'; [], rand(5, 10, 2), {11; 22; 33}};
D1 = C(1, 1) % 元胞數組C中第一行第一列的元胞
D2 = C{1, 1} % 元胞數組C中第一行第一列的元胞的存儲內容
代碼運行結果如下。D1是元胞類型,而D2是邏輯型。

下面舉個例子,說明兩者區別。
% 定義一個1x1的元胞數組 C = {'text'}; % 做法一,可以取出'text'的第二個字符e a1 = C{1}(2) % 做法二,不能取出'text'的第二個字符e,報錯 a2 = C(1)(2) % 做法三,不能取出'text'的第二個字符e,報錯 a3 = C(1) a4 = a3(2)
代碼運行結果如下。做法一是正確的。做法二和做法三是等價的,都是錯誤的。以做法三來分析,a3依然是一個1x1的元胞數組,和C一樣。a3(2)的含義是取出元胞數組a3的第二個元胞,結果當然是超出緯度。

3. 對於元胞數組進行賦值
由於元胞數組的尋訪有上述的兩種,那對它進行賦值也有兩種。
C = {true, 2, 'text'; [], rand(5, 10, 2), {11; 22; 33}};
% 做法一:賦值后,C中第一行第一列的元胞不是原來的元胞,而是新創建的元胞
C(1,1) = {'hello1'}
% 做法二:賦值后,C中第一行第一列的元胞還是原來的元胞,但是元胞的存儲內容改變了。
C{1,1} = 'hello2'
代碼運行結果如下。做法一實際上是更換元胞數組的元胞,做法二實際上是更換元胞數組中元胞的存儲內容。

上面說的是對元胞數組中已有的元胞進行操作,而這里要說的是元胞數組的擴充。
與上面的賦值一樣,可以使用上述兩種做法擴充元胞數組。但是,用這兩種方法擴充元胞數組,新的元胞數組將是包含新增元素的最小元胞數組,而其它新增的元胞將會是空數組。此外,還可以用拼接的方法擴充元胞數組。根據拼接的方式(垂直拼接和水平拼接),待拼接的元胞數組必須符合對應的緯度要求。
figure % 2x1的元胞數組 C = {2; 'text'}; subplot(2, 2, 1); title('55'); cellplot(C); title('原元胞數組') %做法一: C(1, 2) = {'擴展1'}; subplot(2, 2, 2); cellplot(C); title('擴展一'); %做法二: C(2, 3) = {'擴展2'}; subplot(2, 2, 3); cellplot(C); title('擴展二'); %做法三:水平拼接,待拼接的元胞數組的行數必須相等 C = [C, C]; subplot(2, 2, 4); cellplot(C); title('拼接');
代碼運行結果如下。

4. 元胞數組的常用操作函數
有很多函數可以作用於元胞數組,下面舉幾個常用函數的簡單用法。更多函數見元胞數組的官方幫助文檔
- 函數celldisp(),用文字方式顯示元胞數組所有元胞的內容。
- 函數cellplot(),用圖形方式顯示元胞數組所有元胞的內容。
- 函數cellfull(),對元胞數組所有元胞執行一個函數。
C = {'text', rand(2, 2)};
disp('這是celldisp');
celldisp(C);
cellplot(C);
title('這是cellplot');
disp('這是cellfun');
cellfun('isreal', C)
代碼運行結果如下。

