Main Content

使用受保护的分类数组

此示例演示了如何使用包含受保护类别的分类数组。

当使用 categorical 函数创建分类数组时,您可以选择指定是否保护类别。有序分类数组始终具有受保护的类别,但您也可以使用 'Protected',true 名称-值对组参量创建受保护的非有序分类数组。

当指定的值不在数组的类别列表中时,该数组将自动更新,以便其类别列表中包括该新值。类似地,您可以合并具有不同类别的(非有序)分类数组。生成的类别中将同时包括这两个数组中的类别。

在向受保护的分类数组指定新值时,这些值必须属于现有类别之一。类似地,您只能合并具有相同类别的受保护数组。

  • 如果要合并具有受保护类别的两个非有序分类数组,则它们必须具有相同的类别,顺序无关紧要。生成的分类数组使用第一个数组中的类别顺序。

  • 如果要合并始终具有受保护类别的两个有序分类数组,则它们必须具有相同的类别,顺序也必须相同。

要向该数组添加新类别,必须使用 addcats 函数。

创建有序分类数组

创建一个大小包含 10 个对象的分类数组。对值 'S''M''L' 应用名称 smallmediumlarge

A = categorical({'M';'L';'S';'S';'M';'L';'M';'L';'M';'S'},...
                {'S','M','L'},{'small','medium','large'},'Ordinal',true)
A = 10x1 categorical
     medium 
     large 
     small 
     small 
     medium 
     large 
     medium 
     large 
     medium 
     small 

A 是一个 10×1 的分类数组。

显示 A 的类别。

categories(A)
ans = 3x1 cell
    {'small' }
    {'medium'}
    {'large' }

验证类别是否受保护

当创建有序分类数组时,这些类别始终受保护。

使用 isprotected 函数验证 A 的类别是否受保护。

tf = isprotected(A)
tf = logical
   1

A 的类别受保护。

指定新类别值

如果尝试指定一个不属于任何现有类别的新类别值,则 MATLAB® 将返回错误。例如,您无法像表达式 A(2) = 'xlarge' 中一样将值 'xlarge' 赋给分类数组,因为 xlarge 不是 A 的类别。MATLAB® 会返回以下错误:

Error using categorical/subsasgn (line 68)

Cannot add a new category 'xlarge' to this categorical array

because its categories are protected. Use ADDCATS to

add the new category.

要为 xlarge 添加新类别,请使用 addcats 函数。因为 A 是有序的,所以必须指定新类别的顺序。

A = addcats(A,'xlarge','After','large');

现在,使用 'xlarge' 进行赋值,因为它属于现有类别。

A(2) = 'xlarge'
A = 10x1 categorical
     medium 
     xlarge 
     small 
     small 
     medium 
     large 
     medium 
     large 
     medium 
     small 

A 现在是一个包含四个类别的 10×1 分类数组,其中 small < medium < large < xlarge

合并两个有序分类数组

创建另外一个有序分类数组 B,其大小包含五个项目。

B = categorical([2;1;1;2;2],1:2,{'xsmall','small'},'Ordinal',true)
B = 5x1 categorical
     small 
     xsmall 
     xsmall 
     small 
     small 

B 是一个包含两个类别的 5×1 分类数组,其中 xsmall < small

要合并两个始终具有受保护类别的有序分类数组,它们必须具有相同的类别,而且这些类别的顺序也必须相同。

将类别 'xsmall' 添加到 A 的类别 'small' 之前。

A = addcats(A,'xsmall','Before','small');

categories(A)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

将类别 {'medium','large','xlarge'} 添加到 B 的类别 'small' 之后。

B = addcats(B,{'medium','large','xlarge'},'After','small');

categories(B)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

AB 的类别现在相同,包括其顺序也相同。

垂直串联 AB

C = [A;B]
C = 15x1 categorical
     medium 
     xlarge 
     small 
     small 
     medium 
     large 
     medium 
     large 
     medium 
     small 
     small 
     xsmall 
     xsmall 
     small 
     small 

B 中的值将追加到 A 中的值之后。

列出 C 的类别。

categories(C)
ans = 5x1 cell
    {'xsmall'}
    {'small' }
    {'medium'}
    {'large' }
    {'xlarge'}

C 是一个包含五个类别的 16×1 有序分类数组,其中 xsmall < small < medium < large < xlarge

另请参阅

| | | | |

相关示例

详细信息