使用受保护的分类数组
此示例演示了如何使用包含受保护类别的分类数组。
当使用 categorical 函数创建分类数组时,您可以选择指定是否保护类别。有序分类数组始终具有受保护的类别,但您也可以使用 Protected 名称-值参量创建受保护的非有序分类数组。
当指定的值不是类别的成员时,该数组将自动更新,以便其类别列表中包括该新值。类似地,您可以合并具有不同类别的(非有序)分类数组。生成的类别中将同时包括这两个数组中的类别。
在向受保护的分类数组指定新值时,这些值必须属于现有类别之一。类似地,您只能合并具有相同类别的受保护数组。
如果要合并具有受保护类别的两个非有序分类数组,则它们必须具有相同的类别,顺序无关紧要。生成的分类数组使用第一个数组中的类别顺序。
如果要合并始终具有受保护类别的两个有序分类数组,则它们必须具有相同的类别,顺序也必须相同。
要向该数组添加新类别,必须使用 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 = 10×1 categorical
medium
large
small
small
medium
large
medium
large
medium
small
显示 A 的类别。
categories(A)
ans = 3×1 cell
{'small' }
{'medium'}
{'large' }
验证类别是否受保护
当创建有序分类数组时,这些类别始终受保护。
使用 isprotected 函数验证 A 的类别是否受保护。
tf = isprotected(A)
tf = logical
1
A 的类别受保护。
指定新类别值
如果尝试指定一个不属于任何现有类别的新类别值,则 MATLAB® 将返回错误。例如,您无法像表达式 A(2) = "xlarge" 中一样将值 "xlarge" 赋给分类数组,因为 xlarge 不是 A 的类别。MATLAB 会返回以下错误:
Error using () (line 57) 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 = 10×1 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 = 5×1 categorical
small
xsmall
xsmall
small
small
B 是一个包含两个类别的 5×1 分类数组,其中 xsmall < small。
要合并两个始终具有受保护类别的有序分类数组,它们必须具有相同的类别,而且这些类别的顺序也必须相同。
将类别 xsmall 添加到 A 的类别 small 之前。
A = addcats(A,"xsmall",Before="small"); categories(A)
ans = 5×1 cell
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
将类别 medium、large 和 xlarge 添加到 B 的类别 small 之后。
B = addcats(B,["medium" "large" "xlarge"],After="small"); categories(B)
ans = 5×1 cell
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
A 和 B 的类别现在相同,包括其顺序也相同。
垂直串联 A 和 B。
C = [A;B]
C = 15×1 categorical
medium
xlarge
small
small
medium
large
medium
large
medium
small
small
xsmall
xsmall
small
small
B 中的值将追加到 A 中的值之后。
列出 C 的类别。
categories(C)
ans = 5×1 cell
{'xsmall'}
{'small' }
{'medium'}
{'large' }
{'xlarge'}
C 是一个包含五个类别的 16×1 有序分类数组,其中 xsmall < small < medium < large < xlarge。
另请参阅
categorical | categories | summary | isprotected | isordinal | addcats