使用分类数组的好处
分类数据的自然表示形式
categorical
是用于存储具有以下特征的数据的数据类型:此类数据值来自离散分类有限集合。使用分类数组的一种常见替代方法是使用字符数组或字符向量元胞数组。要比较字符数组和字符向量元胞数组中的值,必须使用略微复杂的 strcmp
。使用分类数组时,您可以像比较数值数组一样,使用逻辑运算符 eq
(==
) 比较元素。使用分类数组的另一种常见替代方法是将使用整数的分类数据存储在数值数组中。使用数值数组会丢失类别名称中的所有有用描述信息,还容易让人认为这些整数值只具有其常规的数值意义,而分类数据则不同。
字符向量的数学排序
分类数组是一种方便且节省内存的容器,适用于有限离散类别集合中的非数值数据。当类别按照有意义的数学方法排序时,分类数组会特别有用,例如对于一个由离散类别集合 {'small','medium','large'}
中的条目(其中 small < medium < large
)组成的数组,便是如此。
字符数组或字符向量元胞数组不可采用字母顺序之外的排序方式。因此,不可以进行不相等比较,例如大于和小于。使用分类数组时,您可以使用关系运算来测试相等性,并执行具有有意义的数学排序的逐元素比较。
降低内存要求
以下示例演示了如何比较以字符向量元胞数组或分类数组形式存储数据所需的内存。分类数组具有定义为字符向量的类别,在字符向量元胞数组或 char
数组中存储和处理这些类别需要较大的代价。分类数组仅存储每个类别名称的一个副本,通常会降低存储该数组所需的内存量。
创建一个字符向量元胞数组示例。
state = [repmat({'MA'},25,1);repmat({'NY'},25,1);... repmat({'CA'},50,1);... repmat({'MA'},25,1);repmat({'NY'},25,1)];
显示有关变量 state
的信息。
whos state
Name Size Bytes Class Attributes state 150x1 16200 cell
变量 state
是一个字符向量元胞数组,需要 17,400 字节的内存。
将 state
转换为分类数组。
state = categorical(state);
显示变量 state
中的离散类别。
categories(state)
ans = 3x1 cell
{'CA'}
{'MA'}
{'NY'}
state
包含 150 个元素,但仅有三个不同类别。
显示有关变量 state
的信息。
whos state
Name Size Bytes Class Attributes state 150x1 476 categorical
使用分类数组极大降低了存储该变量所需的内存。