【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.0镜像下载,轻松打... 你有没有想过,想要给你的安卓手机升级到最新的系统,却不知道从哪里下载那个神秘的安卓系统8.0镜像呢?...
安卓系统修改大全,全方位修改大... 你有没有想过,你的安卓手机其实是个大宝藏,里面藏着无数可以让你手机焕然一新的秘密?没错,今天就要来个...
安卓刷miui系统教程,安卓刷... 你有没有想过给你的安卓手机换换口味?别看它现在用得挺顺手的,偶尔来点新鲜感也是不错的。今天,就让我来...
超星学系统安卓版,便捷学习新体... 你有没有发现,学习生活越来越离不开电子设备了?手机、平板,这些小玩意儿简直就是我们的学习小助手。今天...
安卓平板6.0系统安装,轻松上... 你有没有想过,你的安卓平板6.0系统是不是该升级一下了呢?别看它现在看起来还挺精神的,但谁知道背后隐...
安卓系统屏幕显示文字,探索个性... 你有没有发现,手机屏幕上的文字有时候会变得模糊不清,或者颜色暗淡,让人看得很费劲?这可真是让人头疼的...
快递扫描系统下载安卓,便捷物流... 你有没有想过,每次快递员来送快递,他们是怎么快速找到你的包裹的呢?是不是觉得他们有超能力?其实,这背...
安卓系统能打开zip,操作指南... 你有没有想过,你的安卓手机里那些神秘的zip文件到底怎么打开呢?别急,今天就来给你揭秘这个小小的技术...
塞班怎么查找安卓系统,塞班系统... 你有没有想过,你的塞班手机里竟然也能装上安卓系统?听起来是不是有点神奇?别急,今天我就来手把手教你如...
安卓系统短消息提醒,安卓系统短... 你有没有发现,手机里的短消息提醒功能有时候就像一个贴心的管家,有时候又像个爱闹腾的小孩子?今天,咱们...
安卓系统如何跳过密码,安卓系统... 你是不是也和我一样,有时候手机锁屏密码设置得太复杂,每次解锁都要费好大一番力气?别急,今天就来教你怎...
鸿蒙系统功能与安卓,功能对比与... 你知道吗?最近手机圈里可是热闹非凡呢!华为的新操作系统鸿蒙系统(HarmonyOS)一经推出,就引发...
安卓系统卡苹果系统不卡,揭秘两... 你有没有发现,身边的朋友都在争论安卓系统和苹果系统哪个更好?其实,这个问题就像是在问谁家的孩子更聪明...
安卓系统卡解决了吗,安卓系统卡... 你有没有遇到过安卓手机卡顿的问题?是不是每次打开应用都感觉像蜗牛爬行?别急,今天就来聊聊这个让人头疼...
华为安卓系统下载软件,畅享海量... 你有没有想过,手机里的系统就像是我们的大脑,而下载的软件就像是大脑里的各种功能?今天,就让我带你一起...
平板安卓7系统好吗,体验流畅与... 你有没有想过,你的平板电脑的安卓7系统到底怎么样呢?是不是觉得它既熟悉又有点陌生?别急,今天咱们就来...
鸿蒙系统和安卓10,跨时代操作... 你知道吗?最近科技圈可是炸开了锅,因为华为的新操作系统鸿蒙系统横空出世,而且它竟然和安卓10杠上了!...
苹果安卓和鸿蒙系统,三大操作系... 你有没有发现,现在的手机市场就像是一场精彩纷呈的武林大会,各路英雄齐聚一堂,各显神通?没错,说的就是...
鸿蒙怎么还原安卓系统,系统还原... 你是不是也和我一样,对鸿蒙系统里的安卓应用情有独钟呢?最近,不少小伙伴都在问,鸿蒙怎么还原安卓系统?...
荣耀10改回安卓系统,重拾纯净... 你有没有想过,你的荣耀10手机,曾经那般风光无限,如今却想要改回安卓系统呢?这可不是一件小事,得好好...