categorical
数组,包含分配给类别的值
说明
categorical
是为一组有限的离散类别(例如 High
、Med
和 Low
)赋值的数据类型。这些类别可以采用您指定的数学排序,例如 High > Med > Low
,但这并非必须。分类数组可用来有效地存储并方便地处理非数值数据,同时还为数值赋予有意义的名称。分类数组的常见用法是用来指定构成表的各组行。
创建对象
语法
描述
B = categorical(
创建分类数组,其中通过一个或多个 A
,___,Name,Value
)Name,Value
对组参数指定其他选项。您可以包括上述语法中的任何输入参数。
例如,要指示类别采用数学排序,请指定 'Ordinal',true
。
输入参数
A
— 输入数组
数值数组 | 逻辑数组 | 分类数组 | 日期时间数组 | 持续时间数组 | 字符串数组 | 字符向量元胞数组
输入数组,指定为数值数组、逻辑数组、分类数组、日期时间数组、持续时间数组、字符串数组或字符向量元胞数组。
categorical
会删除作为字符串或字符向量的输入值中的前导和尾部空格。
如果 A
包含缺失值,则 B
的相应元素未定义,并显示为 <undefined>
。categorical
函数可将下列值转换为未定义的类别值:
数值数组和持续时间数组中的
NaN
字符串数组中的缺失字符串 (
<missing>
) 或空字符串 (""
)字符向量元胞数组中的空字符向量 (
''
)日期时间数组中的
NaT
分类数组中未定义的值 (
<undefined>
)
对于未定义的值,B
没有对应的类别。要为缺失值或未定义的值创建显式类别,必须在 catnames
中给出所需的类别名称,并在 valueset
中给出缺失值作为对应的值。
A
还可以是具有以下类方法的对象数组:
unique
eq
valueset
— 类别
unique(A)
(默认) | 由唯一值组成的向量
类别,指定为由唯一值组成的向量。valueset
的数据类型和 A
的数据类型必须相同,A
为字符串数组时除外。在这种情况下,valueset
可以是字符串数组或字符向量元胞数组。
categorical
会删除作为字符串或字符向量的 valueset
元素中的前导和尾部空格。
catnames
— 类别名称
字符向量元胞数组 | 字符串数组
类别名称,指定为字符向量元胞数组或字符串数组。如果不指定 catnames
输入参数,categorical
将使用 valueset
中的值作为类别名称。
要将 A
中多个不同的值合并为 B
中的单个类别,请包括与这些值对应的、完全一样的名称。
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: 'Ordinal',true
指定类别具有数学排序方式。
Ordinal
— 有序变量指示符
false
(默认) | true
有序变量指示符,指定为以逗号分隔的对组,其中包含 'Ordinal'
和 false
(0
) 或 true
(1
)。
|
|
|
|
有关详细信息,请参阅 有序分类数组。
Protected
— 受保护类别指示符
false
| true
受保护类别指示符,指定为以逗号分隔的对组,其中包含 'Protected'
和 false
(0
) 或 true
(1
)。有序分类数组的类别始终受保护。当您指定 'Ordinal',true
时,默认值为 true
。否则,值为 false
。
| 在向 |
| 在向 |
示例
转换数组并按类别选择数据
创建一个包含气象站标签的分类数组。将其添加到温度读数表中。然后使用类别按气象站选择温度读数。
首先,创建包含温度读数、日期和气象站标签的数组。
Temps = [58; 72; 56; 90; 76]; Dates = {'2017-04-17';'2017-04-18';'2017-04-30';'2017-05-01';'2017-04-27'}; Stations = {'S1';'S2';'S1';'S3';'S2'};
将 Stations
转换为分类数组。
Stations = categorical(Stations)
Stations = 5x1 categorical
S1
S2
S1
S3
S2
显示类别。三个气象站标签为类别。
categories(Stations)
ans = 3x1 cell
{'S1'}
{'S2'}
{'S3'}
创建包含温度、日期和气象站标签的表。
T = table(Temps,Dates,Stations)
T=5×3 table
Temps Dates Stations
_____ ______________ ________
58 {'2017-04-17'} S1
72 {'2017-04-18'} S2
56 {'2017-04-30'} S1
90 {'2017-05-01'} S3
76 {'2017-04-27'} S2
显示从气象站 S2
获得的读数。您可以使用 ==
运算符找出等于 S2
的 Station
的值。然后使用逻辑索引选择包含气象站 S2
的数据的表行。
TF = (T.Stations == 'S2');
T(TF,:)
ans=2×3 table
Temps Dates Stations
_____ ______________ ________
72 {'2017-04-18'} S2
76 {'2017-04-27'} S2
指定输入数组中不存在的类别
将字符向量元胞数组 A
转换为分类数组。指定包括 A
中不存在的值的类别列表。
创建字符向量元胞数组。
A = {'republican' 'democrat'; 'democrat' 'democrat'; 'democrat' 'republican'};
将 A
转换为分类数组。添加 independent
的类别。
valueset = {'democrat' 'republican' 'independent'}; B = categorical(A,valueset)
B = 3x2 categorical
republican democrat
democrat democrat
democrat republican
显示 B
的类别。
categories(B)
ans = 3x1 cell
{'democrat' }
{'republican' }
{'independent'}
指定整数的类别名称
创建一个数值数组。
A = [1 3 2; 2 1 3; 3 1 2]
A = 3×3
1 3 2
2 1 3
3 1 2
将 A
转换为分类数组 B
并指定类别名称。
B = categorical(A,[1 2 3],{'red' 'green' 'blue'})
B = 3x3 categorical
red blue green
green red blue
blue red green
显示 B
的类别。
categories(B)
ans = 3x1 cell
{'red' }
{'green'}
{'blue' }
B
不是有序的分类数组。因此,您只能使用相等运算符 ==
和 ~=
比较 B
中的值。
找出属于类别 'red'
的元素。使用逻辑索引访问这些元素。
TF = (B == 'red');
B(TF)
ans = 3x1 categorical
red
red
red
创建有序分类数组
创建一个 5×2 的数值数组。
A = [3 2;3 3;3 2;2 1;3 2]
A = 5×2
3 2
3 3
3 2
2 1
3 2
将 A
转换为有序分类数组,其中 1
、2
和 3
分别表示类别 child
、adult
和 senior
。
valueset = [1:3]; catnames = {'child' 'adult' 'senior'}; B = categorical(A,valueset,catnames,'Ordinal',true)
B = 5x2 categorical
senior adult
senior senior
senior adult
adult child
senior adult
由于 B
是有序数组,B
的类别具有数学排序方式 child < adult < senior
。
预分配数组并初始化类别
您可以通过创建一个 NaN
数组并将其转换为分类数组来预分配任意大小的分类数组。预分配数组后,可以通过指定类别名称并将类别添加到数组来初始化其类别。
首先创建一个 NaN
数组。您可以创建任意大小的数组。例如,创建一个由 NaN
值组成的 2×4 数组。
A = NaN(2,4)
A = 2×4
NaN NaN NaN NaN
NaN NaN NaN NaN
然后通过转换 NaN
数组来预分配分类数组。categorical
函数将 NaN
转换为未定义的分类值。正如 NaN
表示“不是数字”,<undefined>
表示不属于某个类别的分类值。
A = categorical(A)
A = 2x4 categorical
<undefined> <undefined> <undefined> <undefined>
<undefined> <undefined> <undefined> <undefined>
事实上,此时 A
没有类别。
categories(A)
ans = 0x0 empty cell array
要初始化 A
的类别,请指定类别名称,并使用 addcats
函数将它们添加到 A
中。例如,添加 small
、medium
和 large
作为 A
的三个类别。
A = addcats(A,["small","medium","large"])
A = 2x4 categorical
<undefined> <undefined> <undefined> <undefined>
<undefined> <undefined> <undefined> <undefined>
虽然 A
的元素是未定义的值,但类别已由 addcats
初始化。
categories(A)
ans = 3x1 cell
{'small' }
{'medium'}
{'large' }
现在 A
已经有了类别,您可以将定义的分类值指定为 A
的元素。
A(1) = "medium"; A(8) = "small"; A(3:5) = "large"
A = 2x4 categorical
medium large large <undefined>
<undefined> large <undefined> small
转换字符串数组
从 R2017a 开始,您可以使用双引号来创建字符串数组。而且,字符串数组可以包含缺失值,显示为 <missing>
,不带双引号。
str = ["plane","jet","plane","helicopter",missing,"jet"]
str = 1x6 string
"plane" "jet" "plane" "helicopter" <missing> "jet"
将字符串数组 str
转换为分类数组。categorical
函数可将缺失的字符串转换为未定义的分类值,显示为 <undefined>
。
C = categorical(str)
C = 1x6 categorical
plane jet plane helicopter <undefined> jet
将数值数据分组为类别
使用 discretize
函数(而不是 categorical
)将 100 个随机数划分为三个类别。
x = rand(100,1); y = discretize(x,[0 .25 .75 1],'categorical',{'small','medium','large'}); summary(y)
small 22 medium 46 large 32
提示
有关接受或返回分类数组的函数列表,请参阅分类数组。
如果输入数组包含的数值、日期时间或持续时间值太接近,则
categorical
函数会将它们截断成重复值。例如,categorical([1 1.00001])
将截断输入数组的第二个元素。要从数值数据创建类别,请使用discretize
函数。
备选方法
您也可以使用 discretize
将数值数据分组到不同的类别中。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
如果类别列表已知,最佳做法是在使用
categorical(A,valueset)
创建 tall 分类数组时提供类别。如果没有提供类别,则许多计算需要 MATLAB® 执行一次额外的数据遍历来确定类别。
有关详细信息,请参阅tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
从 R2019a 开始,您可以在 MATLAB 代码中使用分类数组来进行代码生成。有关详细信息,请参阅 Code Generation for Categorical Arrays (MATLAB Coder) 和 Categorical Array Limitations for Code Generation (MATLAB Coder)。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
用法说明和限制:
对于仅有一个输入的语法
B = categorical(A)
,各类别的顺序未定义。要强制排序,请使用valueset
和catnames
。
有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
在 R2013b 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)