【MATLAB】常用数据类型解析—char, cell, table, struct
创始人
2024-05-08 03:29:41
0

文章目录

  • 0 前期教程
  • 1 前言
  • 2 char
  • 3 cell
    • 3.1 概述
    • 3.2 cell索引
    • 3.3 cell连接
    • 3.4 删除数据
  • 4 table
    • 4.1 构造表格并访问表格中的某个变量
    • 4.2 以矩阵的形式访问表格数据
  • 5 struct
    • 5.1 概述
    • 5.2 删除字段

0 前期教程

  • 【MATLAB】(一)基本使用入门
  • 【MATLAB】(二)基本使用拾遗

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 =logical1
>> b = "20230107" 
b = "20230107"
>> b == "20230107" %字符串由于是标量,因此得到的就是单独的逻辑值
ans =logical1

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 数组列 1 至 3{'text'}    {[2]}    {5×10×2 double}列 4 至 5{[3]}    {3×1 cell}
>> C{2} = [] %删除一个元胞中的数据,维度不改变
C =1×5 cell 数组列 1 至 3{'text'}    {0×0 double}    {5×10×2 double}列 4 至 5{[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 tableLastName     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 tableAge    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×638     1    71   176   124    9343     0    69   163   109    7738     1    64   131   125    8340     0    67   133   117    7549     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

相关内容

热门资讯

安卓系统的手机优缺点,全面解析... 你有没有发现,现在市面上手机种类繁多,让人挑花了眼?其中,安卓系统的手机可是占据了半壁江山呢!今天,...
平板有没有安卓系统,安卓系统引... 你有没有想过,平板电脑到底有没有安卓系统呢?这个问题听起来可能有点奇怪,但确实很多人在选购平板时都会...
安卓手机双系统好用不,安卓手机... 你有没有想过,你的安卓手机是不是也能像多面手一样,既能驾驭工作,又能享受娱乐呢?没错,说的就是那个神...
安卓系统怎么登录国际服,一键操... 你有没有想过,为什么有时候你的安卓手机上会出现那些国际服的游戏呢?是不是好奇怎么登录这些神秘的国外服...
安卓系统的时间天气没了,天气功... 最近你的安卓手机是不是也遇到了一个让人头疼的小问题?那就是——时间天气不见了!没错,就是那个曾经陪伴...
安卓好用的拍照系统,捕捉美好瞬... 你有没有发现,现在手机拍照功能越来越强大了?尤其是安卓手机,拍照系统简直让人爱不释手!今天,就让我带...
软件如何兼容安卓8系统,助您软... 你有没有发现,随着科技的飞速发展,手机软件更新换代的速度也是越来越快呢!这不,安卓8系统已经悄然来临...
安卓通用版系统下载,畅享智能生... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓通用版系统下载!这可是个让无数安卓用户兴奋不...
安卓无线点餐系统ph,PH技术... 你有没有想过,点餐也能变得如此轻松愉快?没错,就是那个我们每天都要面对的吃饭问题,现在有了安卓无线点...
安卓门禁系统怎么样,便捷通行新... 你有没有想过,每天回家时,只需轻轻一刷,门就自动打开了?这就是安卓门禁系统的魅力所在!今天,就让我带...
在电脑上模拟安卓系统,探索虚拟... 你有没有想过,在电脑上也能体验安卓系统的乐趣呢?没错,就是那种随时随地都能玩手机的感觉,现在也能在电...
飞机送餐安卓系统,空中美食新体... 你有没有想过,飞机上的美食是如何送到你手中的?是不是觉得这背后有着神秘的力量?其实,这一切都离不开高...
findx耍原生安卓系统,深度... 亲爱的读者们,你是否厌倦了那些花里胡哨的定制系统,渴望回到那个纯净的安卓世界?今天,我要带你一起探索...
一加系统属于安卓系统吗,引领智... 你有没有想过,手机里的那个神奇的“一加系统”到底是不是安卓系统的一员呢?这可是个让人好奇不已的问题哦...
小米2刷安卓系统吗,探索安卓系... 亲爱的读者,你是否曾经对小米2这款手机刷安卓系统的事情感到好奇呢?今天,就让我带你一探究竟,揭开小米...
安卓7.0系统线刷包,深度解析... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你揭秘如何让你的安卓手机重焕生...
白菜系统和安卓拍照,开启智能生... 你知道吗?最近我在用手机拍照的时候,发现了一个超级酷的功能,简直让我爱不释手!那就是——白菜系统和安...
安卓系统查杀病毒,全方位守护您... 手机里的安卓系统是不是有时候会突然弹出一个查杀病毒的提示?别慌,这可不是什么大问题,今天就来给你详细...
iso系统与安卓各系统哪个好,... 你有没有想过,手机操作系统就像是我们生活中的不同交通工具,各有各的特色和优势。今天,咱们就来聊聊这个...
中柏怎么换安卓系统,解锁更多可... 你有没有发现,中柏的安卓系统有时候用起来还挺不顺手的?别急,今天就来手把手教你如何给中柏手机升级安卓...