使用受保护的分类数组
此示例演示了如何使用包含受保护类别的分类数组。
当使用 categorical
函数创建分类数组时,您可以选择指定是否保护类别。有序分类数组始终具有受保护的类别,但您也可以使用 'Protected',true
名称-值对组参数创建受保护的非有序分类数组。
当指定的值不在数组的类别列表中时,该数组将自动更新,以便其类别列表中包括该新值。类似地,您可以合并具有不同类别的(非有序)分类数组。生成的类别中将同时包括这两个数组中的类别。
在向受保护的分类数组指定新值时,这些值必须属于现有类别之一。类似地,您只能合并具有相同类别的受保护数组。
如果要合并具有受保护类别的两个非有序分类数组,则它们必须具有相同的类别,顺序无关紧要。生成的分类数组使用第一个数组中的类别顺序。
如果要合并始终具有受保护类别的两个有序分类数组,则它们必须具有相同的类别,顺序也必须相同。
要向该数组添加新类别,必须使用 addcats
函数。
创建有序分类数组
创建一个大小包含 10 个对象的分类数组。对值 'S'
、'M'
和 'L'
应用名称 small
、medium
和 large
。
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'}
A
和 B
的类别现在相同,包括其顺序也相同。
垂直串联 A
和 B
。
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
。
另请参阅
categorical
| categories
| summary
| isprotected
| isordinal
| addcats