【MATLAB】常用数据类型解析—char, cell, table, struct

0 前期教程

1 前言

  MATLAB语言其实也是一种动态语言,即在定义变量时不需要设置变量的数据类型,但是和Python一样,也有数据类型的讲究,如果对某种数据类型不够熟悉,那么遇到这类需要处理的数据时,有时候也会耽误不少时间,这里记录一点自己的实践经历。

2 char

官网手册链接

  MATLAB中的char数据类型和C语言中的char类型差不多,都是用来表示字符和字符数组。但是需要注意: 在C语言中,单个字符是用''来表示,而多个字符组成的字符数组是用""来表示,且 “字符数组”和“字符串”是等价的。但是在MATLAB中char只表示字符数组,它是字符向量,用''来表示;而用""表示的叫字符串,它是标量。
  标量和向量的一个重要区别就在于它能够索引其中的单个字符。另外就是向量(矩阵)是可以应用广播机制的。

>> a = "1234" %字符常量,双引号表示
a = 
    "1234"
>> a(1) %只能索引整体
ans = 
    "1234"
>> b = char(a) %类型转换
b =
    '1234'
>> b(3) %因为是向量,是支持索引其中某一个字符的
ans =
    '3'
>> 1 + b %应用广播机制,对每个字符ASCII加1
ans =
    50    51    52    53
>> 1 + a %对于字符常量,加号相当于连接符
ans = 
    "11234"
>> b + "123" %字符数组和字符串连接,会强行转换为字符串,即变成标量
ans = 
    "1234123"

  既然有字符数组和字符串的区别,那自然引出了一个问题:什么情况使用字符数组,什么情况又使用字符串呢?
  关于这个问题,我目前也没有太多的例子,但是个人建议优先使用字符数组,即用''来表示。


  此外,如果要比较两个字符数组是否相同,千万不要直接使用双等号或者不等号,否则它得到的其实是一个向量,而不是一个单独的逻辑值。比较两个字符串是否相同,要使用strcmp函数。

>> a = '20230107' 
a =
    '20230107'
>> a == '20230107' %对于字符数组,直接使用等号判断得到的是一个向量
ans =
  1×8 logical 数组
   1   1   1   1   1   1   1   1
>> strcmp(a, '20230107') %想要得到单独的逻辑值,要使用strcmp函数
ans =
  logical
   1
>> b = "20230107" 
b = 
    "20230107"
>> b == "20230107" %字符串由于是标量,因此得到的就是单独的逻辑值
ans =
  logical
   1

3 cell

3.1 概述

  cell类型即元胞数组,它首先是一个数组,但它相比于一般的数组,有一个重要的特点:cell数组中的元素的数据类型可以是任意的,如整形,浮点,字符向量,字符串,数值矩阵等等,甚至还可以是cell类型,即cell数组可以嵌套
  cell数组和一般的矩阵表示方法不同,它是用{}来表示。构造语法如下所示

C = cell(n) %建立一个n*n的cell数组,每个元素取默认值
C = cell(sz1,...,szN) %建立一个高维的cell数组
C = cell(sz) %传入一个向量,每个元素表示数组的某一维

当然也可以根据需要直接定义,如下所示。

>> C = {1,2,3;'text',rand(5,10,2),{11; 22; 33}}
C =
  2×3 cell 数组
    {[   1]}    {[          2]}    {[     3]}
    {'text'}    {5×10×2 double}    {3×1 cell}

3.2 cell索引

  cell索引是一个新手很容易忽略的问题,那就是它索引要区分是取元胞集还是取元胞的内容。如果是取元胞,用()进行索引;如果是取元胞的内容,用{}索引。其语法如下所示。

>> C = {1,2,3;'text',rand(5,10,2),{11; 22; 33}}
C =
  2×3 cell 数组
    {[   1]}    {[          2]}    {[     3]}
    {'text'}    {5×10×2 double}    {3×1 cell}
>> C(1)  %索引元胞
ans =
  1×1 cell 数组
    {[1]}
>> C{1,2} %索引元胞中的内容
ans =
     2

由于cell数组首先也是一个矩阵,因此如果索引只给一个数,它会按顺序进行索引(按列展开)。此外,还需要注意的是,如果索引到一个cell数组,那么赋值时就要赋予cell类型,如果索引的是cell中的内容,那么赋值时可以赋予任意类型的数据。但是要注意维度都要对应!

3.3 cell连接

  当有多个数据需要整合到一起时,就可以使用cell数组的叠加功能。这里也需要区分两种情况。一种是两个cell中的内容合并,要求这两个cell的某一维要相同(才能进行矩阵拼接);一种是直接将两个cell合并,得到一个更高维的cell,它的内容为这两个cell,此时对两个cell维度无要求。如下所示。

>> C = {1,2,3;'text',rand(5,10,2),{11; 22; 33}}
C =
  2×3 cell 数组
    {[   1]}    {[          2]}    {[     3]}
    {'text'}    {5×10×2 double}    {3×1 cell}
>> D = {'12','34','56'}
D =
  1×3 cell 数组
    {'12'}    {'34'}    {'56'}
>> X = [C;D] %两个cell列数相同,可以上下拼接
X =
  3×3 cell 数组
    {[   1]}    {[          2]}    {[     3]}
    {'text'}    {5×10×2 double}    {3×1 cell}
    {'12'  }    {'34'         }    {'56'    }
>> Y = {C, D} %对两个cell维度无要求,得到的cell就只有两个元素
Y =
  1×2 cell 数组
    {2×3 cell}    {1×3 cell}

3.4 删除数据

  cell数组删除数据和添加数据差不多,也需要区分是删除元胞(维度改变)和删除元胞中的数据(维度不改变)

>> C = {1,2,3;'text',rand(5,10,2),{11; 22; 33}}
C =
  2×3 cell 数组
    {[   1]}    {[          2]}    {[     3]}
    {'text'}    {5×10×2 double}    {3×1 cell}
>> C(1) = [] %删除一个元胞,导致数组维度改变,被迫变成一个向量
C =
  1×5 cell 数组
  列 13
    {'text'}    {[2]}    {5×10×2 double}45
    {[3]}    {3×1 cell}
>> C{2} = [] %删除一个元胞中的数据,维度不改变
C =
  1×5 cell 数组
  列 13
    {'text'}    {0×0 double}    {5×10×2 double}45
    {[3]}    {3×1 cell}

4 table

  table数据类型其实和cell类型差不多,主要区别在于table是按列存储的,表格中每一段列向数据存储在一个变量中。

T = table(var1,...,varN) %将多个数组合并为一个table,要求行数相同,列数和数据类型可以不同
T = table('Size',sz,'VariableTypes',varTypes) %sz为一个向量,表示行列数
T = table(___,'VariableNames',varNames) %VariableNames指定变量名,要求和变量数相同,不指定默认为原变量名
T = table(___,'RowNames',rowNames) %指定每一行的名称
T = table %构造一个空表

4.1 构造表格并访问表格中的某个变量

%% 构造表格容纳多个变量
LastName = {'Sanchez';'Johnson';'Li';'Diaz';'Brown'};
Age = [38;43;38;40;49];
Smoker = logical([1;0;1;0;1]);
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];

T = table(LastName,Age,Smoker,Height,Weight,BloodPressure)
%输出:
T=5×6 table
    LastName     Age    Smoker    Height    Weight    BloodPressure
    _________    ___    ______    ______    ______    _____________

    'Sanchez'    38     true        71       176       124     93  
    'Johnson'    43     false       69       163       109     77  
    'Li'         38     true        64       131       125     83  
    'Diaz'       40     false       67       133       117     75  
    'Brown'      49     true        64       119       122     80  

%% 访问其中某个变量
meanHeight = mean(T.Height)
%输出:
meanHeight = 67

4.2 以矩阵的形式访问表格数据

Age = [38;43;38;40;49];
Smoker = logical([1;0;1;0;1]);
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];

T = table(Age,Smoker,Height,Weight,BloodPressure)
% 输出:
T=5×5 table
    Age    Smoker    Height    Weight    BloodPressure
    ___    ______    ______    ______    _____________

    38     true        71       176       124     93  
    43     false       69       163       109     77  
    38     true        64       131       125     83  
    40     false       67       133       117     75  
    49     true        64       119       122     80  

%以矩阵形式访问数据
T.Variables
ans = 5×6

    38     1    71   176   124    93
    43     0    69   163   109    77
    38     1    64   131   125    83
    40     0    67   133   117    75
    49     1    64   119   122    80

5 struct

5.1 概述

  MATLAB中的结构体(struct)和C语言中的结构体类似,也是可以包含多个变量的一种数据类型,每个变量都有变量名和变量的取值,这个在MATLAB中叫做字段(field)值(value),其语法如下所示。

s = struct
s = struct(field,value)
s = struct(field1,value1,...,fieldN,valueN)
s = struct([])

这里需要注意的是,值value可以是任意数据类型,这一点和cell数组是类似的。字段field有两种类型,一种是用变量名去表示,另一种是用“常量数据”去表示,一般是字符串标量或字符数组向量,而且要求必须以字母为开头,且只包含字母,数字和下划线
  struct数据类型添加项时可以像Python中的字典一样,直接structName.filename = value,非常方便。
  下面看个例子来具体了解一下struct添加项和字段的使用。

>> A = struct %构造一个空的struct
A = 
  不包含字段的 struct。
>> label = "1234" %构造一个变量作为字段,此时对于变量的取值没有要求
label = 
    "1234"
>> A.label = {'hello'} %这个字段名直接就是变量名,变量值无所谓了
A = 
  包含以下字段的 struct:

    label: {'hello'}
>> A.('hhh') = {'world'} %加上一个()来设置字符串/字符向量 常量作为字段名
A = 
  包含以下字段的 struct:

    label: {'hello'}
      hhh: {'world'}
>> x = "test"
x = 
    "test"
>> A.(x) = 123 %如果一定要调用变量的取值,可以加上一个括号来取其中的内容
A = 
  包含以下字段的 struct:

    label: {'hello'}
      hhh: {'world'}
     test: 123

5.2 删除字段

  上面简要介绍了struct如何添加项,直接使用字段即可,非常方便。如果要删除字段,需要调用单独的函数来实现——rmfield

s = rmfield(s,field)

如果要删除所有字段,可以直接令其等于空的struct。

s = struct
  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

记录无知岁月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值