MATLAB - 元胞陣列



在 MATLAB 中,元胞陣列是一種靈活的資料結構,允許您儲存不同型別和大小的資料。這與常規陣列不同,在常規陣列中,陣列中的元素必須具有相同的資料型別。

元胞陣列提供了靈活性,在處理混合資料時特別有用。元胞陣列非常擅長處理複雜資料集,並能夠建立更動態和高效的 MATLAB 程式碼。

元胞陣列與普通陣列

元胞陣列和普通陣列都是 Matlab 中的資料結構。以下是它們之間的區別:

元胞陣列 普通陣列
元胞陣列可以儲存不同資料型別的元素,例如數字、字串、其他陣列,甚至其他元胞陣列。 普通陣列(數值陣列或矩陣)只能儲存相同資料型別的元素。例如,如果您建立一個數值陣列,則所有元素都必須是相同資料型別的數字(例如,double、int 等)。
元胞陣列使用花括號 {} 來索引和訪問單個元素。 普通陣列使用圓括號 () 來索引和訪問元素。
元胞陣列可以在執行時動態增長或縮小,允許您根據需要新增或刪除元素,而無需預先分配任何記憶體。 普通陣列一旦建立,其大小就固定了。要更改普通陣列的大小,您需要建立一個新陣列並複製資料。
元胞陣列在處理不同大小的資料元素時記憶體效率更高。 普通陣列具有固定大小,如果您需要儲存資料,則必須分配額外的記憶體。
訪問元胞陣列中的元素可能比訪問普通陣列中的元素稍慢,這是因為處理不同資料型別和大小的複雜資料結構。 訪問普通陣列中的元素通常更快,因為所有元素都具有相同的資料型別。
元胞陣列適用於處理複雜和混合資料 元胞陣列適用於處理複雜和混合資料。它們擅長處理多個輸出函式並分層組織資料。 普通陣列非常適合數值計算、矩陣運算以及資料型別統一且大小固定的應用。

元胞陣列的描述和建立

您可以透過以下方式建立元胞陣列:

  • 使用元胞陣列運算子 {}
  • 使用 cell() 函式

要使用運算子 {} 建立元胞陣列

元胞陣列是一種資料結構,它包含稱為單元格的索引資料容器,其中每個單元格都可以靈活地儲存任何型別的資料。

要建立元胞陣列,我們需要使用花括號 {}。

示例

C = {'2023-07-23',[10 20 30 40]}

在 matlab 中執行後,您將獲得以下結果:

>> C = {'2023-07-23',[10 20 30 40]}

C =
{
  [1,1] = 2023-07-23
  [1,2] =

     10   20   30   40

}

>> 

我們上面建立的元胞陣列的大小為 1x2,即一行兩列。

讓我們再新增一行,如下所示:

C(2,:) = {'2023-07-24',[11 22 33 44]};

執行後將獲得以下單元格:

C =

  2x2 cell array

   {'2023-07-23'}    {[10 20 30 40]}
   {'2023-07-24'}    {[11 22 33 44]}

>> 

讓我們再新增一行。

C(3,:) = {'2023-07-25',[1 2 3 4]};

執行後的輸出為:

C =

  3x2 cell array

   {'2023-07-23'}    {[10 20 30 40]}
   {'2023-07-24'}    {[11 22 33 44]}
   {'2023-07-25'}    {[    1 2 3 4]}

>> 

因此,我們現在有 3 行 2 列,使其成為一個 3x2 元胞陣列。

現在,要訪問第一行,您可以簡單地執行以下操作:

C(1,:)

執行後的輸出為:

>> C(1,:)

ans =

  1x2 cell array

   {'2023-07-23'}    {[10 20 30 40]}

>> 

要訪問第一行中的第二列,您可以簡單地執行以下操作:

C(1,2)

執行後的輸出為:

>> C(1,2)

ans =

  1x1 cell array

   {[10 20 30 40]}

>>

您還可以建立空單元格,如下所示:

A = {}

執行後,您應該看到如下所示:

>> A = {}

A =

   0x0 empty cell array

>> 

擁有空單元格陣列後,您可以根據需要向其中新增資料。

使用 cell() 函式

此方法允許您預分配元胞陣列,以便以後分配資料。

語法

C = cell(n)
C = cell(sz1,...,szN)
C = cell(sz)
  • 建立一個大小為 nxn 的元胞陣列 cell(n) 返回一個 n×n 的元胞陣列,其中包含空矩陣。
  • 建立一個大小為 sz1-by-...-by-szN 的元胞陣列 cell(sz1,...,szN) 返回一個 sz1,...,szN 的元胞陣列,其中包含空矩陣。這裡 sz1..szN 表示每個維度的尺寸。例如 cell(3,3) 將返回一個大小為 3x3 的元胞陣列。
  • 建立一個大小為 sz 向量 的空元胞陣列。例如 cell([3,3]) 將返回一個 3x3 的元胞陣列。

讓我們看看使用 cell() 函式的一些示例。

示例 1

A = cell(2)

在 matlab 命令視窗中執行後,輸出為:

>> A = cell(2)

A =
{
  [1,1] = [](0x0)
  [2,1] = [](0x0)
  [1,2] = [](0x0)
  [2,2] = [](0x0)
}

>> 

示例 2

在此示例中,將建立一個大小為 3x3x3 的元胞陣列。該元胞陣列在建立時為空,但其大小將為 3x3x3。

C = cell(3,3,3);

執行後,您將獲得以下輸出:

>> C = cell(3,3,3)

  3x3x3 cell array

C(:,:,1) = 

   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}

C(:,:,2) = 

   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}

C(:,:,3) = 

   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}

>> 

示例 3

在此示例中,將建立一個空元胞陣列,然後更新其中的資料。資料將是不同型別。

C = cell(2, 3);

執行後,您將看到一個大小為 2x3 的空元胞陣列,如下所示:

>> C = cell(2, 3)

C =

  2x3 cell array

   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}

>>

現在讓我們為每個單元格分配資料。

C{1, 1} = 'Hello';
C{1, 2} = 50;
C{1, 3} = [1, 2, 3];
C{2, 1} = 3.14;
C{2, 2} = 'TEST';
C{2, 3} = magic(3);

執行後將獲得以下結果:

>> C = cell(2, 3)

C =

  2x3 cell array

   {0x0 double}    {0x0 double}    {0x0 double}
   {0x0 double}    {0x0 double}    {0x0 double}

>> C{1, 1} = 'Hello';
C{1, 2} = 50;
C{1, 3} = [1, 2, 3];
C{2, 1} = 3.14;
C{2, 2} = 'TEST';
C{2, 3} = magic(3);

>> C

C =

  2x3 cell array

   {'Hello' }    {[  50]}    {[   1 2 3]}
   {[3.1400]}    {'TEST'}    {3x3 double}

>> 

元胞陣列中的每個單元格都可以儲存不同型別的資料,例如字串、數字、矩陣、陣列;這使得元胞陣列在 MATLAB 中處理異構資料時更加靈活。

將陣列轉換為元胞陣列

在這裡,我們將瞭解如何將給定陣列轉換為元胞陣列。我們將使用函式 num2cell()。

num2cell()

num2cell() 允許您將數值陣列轉換為元胞陣列,其中數值陣列的每個元素都成為元胞陣列的元素。

示例

nArr = [1, 2, 3, 4, 5];
C = num2cell(nArr)

在 Matlab 命令視窗中執行後,輸出為:

>> nArr = [1, 2, 3, 4, 5];
C = num2cell(nArr)

C =
{
  [1,1] = 1
  [1,2] = 2
  [1,3] = 3
  [1,4] = 4
  [1,5] = 5
}

>> 

在這個例子中,num2cell() 函式將給定的數值陣列 [1, 2, 3, 4, 5] 轉換為一個元胞陣列,其中數值陣列的每個元素都變成了元胞陣列的一個元素。元胞陣列 C 與給定的數值陣列具有相同的大小,並且每個元胞包含數值陣列中的一個元素。

將表格轉換為元胞陣列

在本節中,我們將看到一個示例,展示如何將表格轉換為元胞陣列。

Matlab 帶有一個名為 table2cell() 的函式,可以幫助將表格轉換為元胞陣列。在此過程中,表格中的每個變數都將成為元胞的列。

table2cell()

table2cell() 函式用於將表格轉換為元胞陣列。表格和元胞陣列是 MATLAB 中兩種不同的資料結構,表格用於儲存和管理具有命名列的表格資料,而元胞陣列是更通用的容器,可以在不同的元胞中儲存不同型別的資料。

當您想要執行更容易使用元胞陣列完成的操作時,將表格轉換為元胞陣列(使用 table2cell())會很有用。

示例

Name = {'Riya'; 'Siya'; 'Tiya'};
Age = [25; 30; 28];
Height = [160; 175; 168];
Weight = [55; 70; 65];
T = table(Name, Age, Height, Weight);

C = table2cell(T)

在上面的例子中,我們首先建立一個包含 Name、Age、Height 和 Weight 列的示例表格 T。然後,我們使用 table2cell() 函式將表格 T 轉換為元胞陣列 C。最後,我們顯示元胞陣列 C 中的內容。

當您在 Matlab 命令視窗中執行相同的操作時,輸出為:

>> Name = {'Riya'; 'Siya'; 'Tiya'};
Age = [25; 30; 28];
Height = [160; 175; 168];
Weight = [55; 70; 65];
T = table(Name, Age, Height, Weight);

C = table2cell(T)

C =

  3x4 cell array

   {'Riya'}    {[25]}    {[160]}    {[55]}
   {'Siya'}    {[30]}    {[175]}    {[70]}
   {'Tiya'}    {[28]}    {[168]}    {[65]}

>> 
廣告