MATLAB 基础知识 数据类型 分组数组 创建分类数组

本文说明如何创建分类数组。categorical 是一个数据类型,用来存储值来自一组有限离散类别的数据。这些分类可以采用自然排序,但并不要求一定如此。分类数组可用来有效地存储并方便地处理数据,同时还为数值赋予有意义的名称。分类数组通常用在表中以定义由行构成的组。

默认情况下,分类数组包含的是未采用数学排序的类别。例如,离散的宠物类别集合 {‘dog’ ‘cat’ ‘bird’} 未采用有意义的数学排序,因此 MATLAB 使用字母排序 {‘bird’ ‘cat’ ‘dog’}。有序分类数组包含的类别具有有意义的数学排序。例如,离散的大小类别集合 {‘small’, ‘medium’, ‘large’} 采用数学排序 small < medium < large。

当您基于字符向量元胞数组或字符串数组创建分类数组时,前导空格和尾随空格将被删除。例如,如果您将文本 {’ cat’ 'dog '} 指定为类别,则在将它们转换为类别时,它们将变成 {‘cat’ ‘dog’}。

基于字符向量元胞数组创建分类数组

您可以使用 categorical 函数基于数值数组、逻辑数组、字符串数组、字符向量元胞数组或现有的分类数组来创建分类数组。

创建一个包含新英格兰地区的各州名的 1×11 字符向量元胞数组。

state = {'MA','ME','CT','VT','ME','NH','VT','MA','NH','CT','RI'};

将元胞数组 state 转换为未采用数学排序的分类数组。

state = categorical(state)
state = 1x11 categorical
  Columns 1 through 9

     MA      ME      CT      VT      ME      NH      VT      MA      NH 

  Columns 10 through 11

     CT      RI 

class(state)
ans = 
'categorical'

列出变量 state 中的离散类别。

categories(state)
ans = 6x1 cell
    {'CT'}
    {'MA'}
    {'ME'}
    {'NH'}
    {'RI'}
    {'VT'}

这些类别按字母顺序列出。

基于字符向量元胞数组创建有序分类数组

创建一个大小包含八个对象的 1×8 字符向量元胞数组。

AllSizes = {'medium','large','small','small','medium',...
            'large','medium','small'};

元胞数组 AllSizes 具有三个相异值:‘large’、‘medium’ 和 ‘small’。使用字符向量元胞数组时,没有方便的方式来指示 small < medium < large。

将元胞数组 AllSizes 转换为有序分类数组。使用 valueset 指定用于定义类别的值 small、medium 和 large。对于有序分类数组,所指定的第一个类别是最小的,最后一个类别是最大的。

valueset = {'small','medium','large'};
sizeOrd = categorical(AllSizes,valueset,'Ordinal',true)
sizeOrd = 1x8 categorical
  Columns 1 through 6

     medium      large      small      small      medium      large 

  Columns 7 through 8

     medium      small 

class(sizeOrd)
ans = 
'categorical'

分类数组 sizeOrd 中值的顺序保持不变。

列出分类变量 sizeOrd 中的离散类别。

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

这些类别按指定的顺序列出以匹配数学排序 small < medium < large。

基于分 bin 数值数据创建有序分类数组

创建由 0 到 50 之间的 100 个随机数构成的向量。

x = rand(100,1)*50;

使用 discretize 函数,通过对 x 的值进行 bin 划分,创建一个分类数组。将 0 到 15 之间的所有值归入第一个 bin,15 到 35 之间的所有值归入第二个 bin,35 到 50 之间的所有值归入第三个 bin。每个 bin 包括左端点,但不包括右端点。

catnames = {'small','medium','large'};
binnedData = discretize(x,[0 15 35 50],'categorical',catnames);

binnedData 是一个包含三个类别的 100×1 有序分类数组,其中 small < medium < large。

使用 summary 函数输出每个类别中的元素数量。

summary(binnedData)
     small       30 
     medium      35 
     large       35 

基于字符串数组创建分类数组

从 R2016b 开始,您可以使用 string 函数创建字符串数组,并将字符串数组转换为分类数组。

创建一个包含行星名称的字符串数组。

str = string({'Earth','Jupiter','Neptune','Jupiter','Mars','Earth'})
str = 1x6 string
    "Earth"    "Jupiter"    "Neptune"    "Jupiter"    "Mars"    "Earth"

将 str 转换为分类数组。

planets = categorical(str)
planets = 1x6 categorical
     Earth      Jupiter      Neptune      Jupiter      Mars      Earth 

将缺失的元素添加到 str,并将其转换为分类数组。在 str 包含缺失值的位置,planets 包含未定义值。

str(8) = 'Mars'
str = 1x8 string
  Columns 1 through 6

    "Earth"    "Jupiter"    "Neptune"    "Jupiter"    "Mars"    "Earth"

  Columns 7 through 8

    <missing>    "Mars"

planets = categorical(str)
planets = 1x8 categorical
  Columns 1 through 6

     Earth      Jupiter      Neptune      Jupiter      Mars      Earth 

  Columns 7 through 8

     <undefined>      Mars 
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结冰架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值