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]}

>> 
广告