MATLAB數據類型 — 元胞(cell)


前言

在編寫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)      

代碼運行結果如下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM