MATLAB - 分类数组



分类数组是 MATLAB 中的一种数据类型,允许处理离散数据。离散数据是指由不同的、独立的值或类别组成的数据类型。离散数据只能取特定的、有限的值,通常是整数或不同的类别。

分类数组提供了一种有效存储和用户友好的非数值数据处理方法,并有助于保留数据值的描述性标签。

以下是使用分类数组的一些优点。

  • 与元胞数组或常规字符串数组相比,分类数组更有效地使用内存。这在处理大型数据集时尤其有利。
  • 分类数组能够更快地进行数据操作和分析。许多函数和运算都针对分类数组进行了优化,与处理字符串相比,这提高了性能。
  • 分类数组使管理和维护数据中一致的类别变得容易。
  • 使用分类数组创建的可视化通常具有更清晰的标签和图例,从而更容易传达数据中的见解。

此外,使用分类数组还有一些缺点:

  • 分类数组最适合管理离散数据。如果您的数据包含连续或数值数据,则使用分类数组可能不是最佳选择,因为它们主要设计用于非数值的分类信息。
  • 很难对分类数组执行复杂的运算。

创建分类数组

可以使用以下方法在 MATLAB 中创建分类数组:

  • categorical() 函数
  • discretize() 函数

使用 categorical() 函数

可以使用 categorical() 函数将字符串或数字数组转换为分类数组。

语法

C = categorical(A)

这里 C 是从给定数组 A 创建的分类数组。

示例 1

在这个例子中,我们将使用元胞数组数据,其详细信息如下所示。

data = {'Red', 'Blue', 'Green', 'Red', 'Green'};
primary_colors  = categorical(data)

使用 categorical() 函数将元胞数组转换为分类数组。

在 MATLAB 命令窗口中执行时,输出为:

>> data = {'Red', 'Blue', 'Green', 'Red', 'Green'};
primary_colors  = categorical(data)

primary_colors = 

   1x5 categorical array

   Red      Blue      Green      Red      Green 

>> 

如果您想从 primary_colors 中了解类别,您可以使用 categories() 方法,该方法有助于从给定的分类数组中获取唯一类别。

categories(primary_colors)

此方法将给出分类数组 primary_colors 中存在的不同类别。

在 MATLAB 命令窗口中执行相同的操作时,输出如下:

>> categories(primary_colors)

ans =

   3x1 cell array
   
   {'Blue' }
   {'Green'}
   {'Red'  }

>>

示例 2

在这个例子中,我们将首先创建一个数值数组,然后为整数值分配类别。

A = [1 3 2; 2 1 3; 3 1 2]

C = categorical(A,[1 2 3],{'AA' 'BB' 'CC'})

在上面的例子中,A 是一个 3 行 3 列的矩阵。此矩阵的每个元素都是一个整数。

现在,代码 C = categorical(A,[1 2 3],{'AA' 'BB' 'CC'}) 使用指定的类别将数值数组 A 转换为分类数组 C。

  • A 是您要转换的数组。
  • [1 2 3] 指定数组 A 中存在的不同整数值。
  • {'AA' 'BB' 'CC'} 提供要分配给整数值 1、2 和 3 的相应类别。

分类数组 C 的每个元素都对应于原始数组 A 的元素,它将整数值映射到其相应的类别。例如:

  • A 中的整数 1 映射到 C 中的 'CC'。
  • A 中的整数 2 映射到 C 中的 'BB'。
  • A 中的整数 3 映射到 C 中的 'AA'。

在 Matlab 中执行后,输出为:

>> A = [1 3 2; 2 1 3; 3 1 2]

C = categorical(A,[1 2 3],{'AA' 'BB' 'CC'})

A =

   1     3     2
   2     1     3
   3     1     2

C = 

  3x3 categorical array

   AA      CC      BB 
   BB      AA      CC 
   CC      AA      BB 

>> 

示例 3

在这个例子中,我们将创建一个有序分类数组。

有序分类数组遵循现有类别中的自然顺序或层次结构。

A = [3 2;3 3;3 2;2 1;3 2]
valueset = [1:3];
categorynames = {'poor' 'fair' 'good'};

B = categorical(A,valueset,categorynames ,'Ordinal',true)

矩阵 A 是一个 5x2 矩阵,包含整数值。此矩阵有 5 行 2 列,每个元素都是一个整数。

valueset 是一个向量 [1, 2, 3],它定义了矩阵 A 中可能存在的整数值。这表示有序类别的级别。

categorynames 是一个元胞数组 {'poor', 'fair', 'good'},它将相应的类别名称分配给 valueset 中的值。类别名称的顺序对应于 valueset 中值的顺序。

The code : B = categorical(A, valueset, categorynames, 'Ordinal', true); 

将数值数组 A 转换为使用指定的 valueset 和 categorynames 的有序分类数组 B。

  • A 是要转换的数值数组。
  • valueset 定义数组中存在的不同整数值。
  • categorynames 为整数值提供相应的类别名称。
  • 'Ordinal', true 指定分类数组 B 应被视为有序,这意味着类别的顺序很重要。

执行后,输出如下:

>> A = [3 2;3 3;3 2;2 1;3 2]
valueset = [1:3];
categorynames = {'poor' 'fair' 'good'};

B = categorical(A,valueset,categorynames ,'Ordinal',true)

A =

   3     2
   3     3
   3     2
   2     1
   3     2

B = 

  5x2 categorical array

   good      fair 
   good      good 
   good      fair 
   fair      poor 
   good      fair 

>> 

使用 discretize() 函数

创建类别类型数据的另一种方法是在 Matlab 中使用 discretize() 函数。

此函数采用数值数组,并根据指定的边缘或所需的箱数将其划分为离散类别或箱。

语法

Y = discretize(X,edges)

这里

X - 您想要离散化的输入数据。

edges - 您想要将数据分类到的箱或区间的边缘。

示例

scores = [68, 75, 82, 90, 55, 78, 92, 60, 88, 72];
edges = [0, 60, 80, 100];
categories = discretize(scores, edges)

在这个例子中,edges 数组定义了对分数进行分类的区间。低于 60 的分数将被归类为“低”,60 到 80 之间的分数将被归类为“中”,80 到 100 之间的分数将被归类为“高”。

执行后,输出如下:

>> scores = [68, 75, 82, 90, 55, 78, 92, 60, 88, 72];
edges = [0, 60, 80, 100];
categories = discretize(scores, edges)

categories =

   2     2     3     3     1     2     3     2     3     2
广告