MatLab 02_MatLab数据类型

一、MATLAB 数据类型

1.1 MATLAB 数据类型概述

在MATLAB中 ,数据类型是非常重要的概念,因为它们决定了如何存储和操作数据。

MATLAB支持 数值型(numeric)、字符型(char)、字符串型(string —— Char Arrays)、逻辑型(logical)、结构体(struct)、单元数组(Cell Array, 也称为 元胞数组)、数组和矩阵(Arrays and Matrices) 等多种数据类型。

MATLAB 是一种动态类型语言,这意味着变量的数据类型是在赋值时自动确定的。用户可以直接赋值,MATLAB 会根据所赋的值自动推断变量的类型。

MATLAB可以使用 whos 查看变量信息(包括变量的名称、大小、字节数、数据类型等)。

MatLab 中基本数据类型有:数值、字符、逻辑值、结构体、元胞数组(cell)。

alt text

二、数值类型(numeric)

2.1 数值类型(numeric)分类

  • 整型:整数类型分为有符号整数和无符号整数,分别使用8位、16位、32位或64位存储。可以根据变量的需求选择合适的整数类型;
  • 浮点型:有 双精度浮点数(double) 和 单精度浮点数(single) 两类,MATLAB默认的数据类型,它使用64位来存储数字的 双精度浮点数(double),它具有较高的精度和范围;使用32位存储数字是单精度浮点数(single),相比双精度,数值范围较小,精度较低。
  • 复数型:MATLAB对复数支持非常好,可以直接输入复数形式(例如3 + 4i或3 + 4j)。

MATLAB 默认情况下以双精度浮点形式 (double) 存储数值数据。

2.2 整型(int)

MATLAB依据在内存中分配的字节数(字节数不同其表示范围就不同)的不同,把整数分为四个有符号整数类(int8、int16、int32、int64) 和 四个无符号整数类(uint8、uint16、uint32、uint64)。

  • 有符号类型: 可以处理负整数以及正整数,但表示的数字范围不如无符号类型广泛,因为有一个bit用于指定数字的正号(0)或负号(1)。
  • 无符号类型:提供了更广泛的数字范围,但这些数字只能为零或正数。

MATLAB支持以 1字节(8bit)、2字节、4字节和 8字节 四种内存大小形式存储整数数据。如果使用可容纳某数据的最小整数类型来存储某数据,则可以节省程序内存和执行时间。例如,不应使用 32 位整数来存储值 100。

八个整数类 存储的值范围 创建该类型所需的转换函数
有符号 8 位整数 (10000000~01111111) -27 到 27-1 int8
有符号 16 位整数 -215 到 215-1 int16
有符号 32 位整数 -231 到 231-1 int32
有符号 64 位整数 -263 到 263-1 int64
无符号 8 位整数 (00000000~11111111) 0 到 28-1 uint8
无符号 16 位整数 0 到 216-1 uint16
无符号 32 位整数 0 到 232-1 uint32
无符号 64 位整数 0 到 264-1 uint64

创建整数数据:

MATLAB默认情况下以双精度浮点形式 (double) 存储数值数据。要以整数形式存储数据,需要从 double 转换为所需的整数类型。

例如,如果要以 16 位有符号整数形式存储赋给变量 x 的值 325,请键入:

1
x = int16(325);

如果待转换的数值带有小数部分,MATLAB 将舍入到最接近的整数。如果小数部分正好是 0.5,则 MATLAB 会从两个同样临近的整数中选择绝对值大小更大的整数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
>> a = 23.8
a =
   23.8000
>> int8(a)
ans =
   24

>> b = 52.5
b =
   52.5000
>> int8(b)
ans =
   53

2.3 浮点型(float)

MATLAB 以 双精度(double) 或 单精度(single) 格式表示 浮点数(float),默认为双精度(double)。单精度型实数在内存中占用4个字节,而双精度型在内存中占用8个字节,所以双精度的数据精度更高。

一般使用双精度来存储大于 3.4 x $10^{38}$ 或约小于 -3.4 x $10^{38}$ 的值。对于位于这两个范围之间的数值,可以使用双精度,也可以使用单精度,但单精度需要的内存更少。

浮点数(float) 类型转换函数:

  • single() :将其它类型的数据转换为单精度型 。
  • double() :将 其它类型的数据转换为双精度型
1
2
3
4
5
6
>> class(4)  % 数值数据默认为``double类型``
ans =
    'double'
>> class(single(4))
ans =
    'single'

2.4 数值数据的输出格式

数值格式仅影响数字显示在命令行窗口输出中的方式,而不是 MATLAB计算或保存它们的方式。

format style 将命令行窗口中的输出显示格式更改为 style 指定的格式。

format 自行将输出格式重置为默认值,即浮点表示法的短固定十进制小数点格式和适用于所有输出行的宽松行距。

Style 结果 示例
short (default) 短固定十进制小数点格式,小数点后包含 4 位数。 3.1416
long() 长固定十进制小数点格式,double 值的小数点后包含 15 位数,single 值的小数点后包含 7 位数。 3.141592653589793
shortE 短科学记数法,小数点后包含 4 位数。 3.1416e+00
longE 长科学记数法,double 值的小数点后包含 15 位数,single 值的小数点后包含 7 位数。 3.141592653589793e+00
shortG 短固定十进制小数点格式或科学记数法(取更紧凑的一个),总共 5 位。 3.1416
longG 长固定十进制小数点格式或科学记数法(取更紧凑的一个),对于 double 值,总共 15 位;对于 single 值,总共 7 位。 3.14159265358979
shortEng 短工程记数法,小数点后包含 4 位数,指数为 3 的倍数。 3.1416e+000
longEng 长工程记数法,包含 15 位有效位数,指数为 3 的倍数。 3.14159265358979e+000
+ 正/负格式,对正、负和零元素分别显示 +、- 和空白字符。 +
bank 货币格式,小数点后包含 2 位数。 3.14
hex 二进制双精度数字的十六进制表示形式。 400921fb54442d18
rat 小整数的比率。 355/113

三、字符型(Char)

3.1 字符型(Char)简介

字符型用于存储文本数据。MATLAB支持两种字符类型:

  • 字符数组:可用单引号括起来的字符串。字符数组实际上是一个字符的向量,可以通过char函数进行转换。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>> chr = 'Hello, 小白!'     % 创建一个字符数组

chr =

    'Hello, 小白!'

>> lenggth(chr)

ans =

    10

>> whos chr
Name      Size          Bytes   Class    Attributes

chr       lx10          20      char
>>
  • 字符串数组:使用双引号括起来的字符串。字符串数组是以一种更为现代化的方式来存储和处理文本数据。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>> str_array = "Hello, 小白!"; % 创建一个字符串数组

str_array =

    "Hello, 小白!"

>> lenggth(str_array)

ans =

    1

>> whos str_array
Name            Size          Bytes   Class    Attributes

str_array       lx1           166     string
>>

字符数组 每个字符占2字节,没有额外开销,适合存储单一文本或固定长度的多行文本。 字符串数组 每个元素是一个字符串,可能有较大的固定开销,适合存储不同长度的文本,尤其是当各文本长度差异较大时,避免填充空格。

因此,使用时应根据需要选择:若文本长度相同或相近,优先使用字符数组以节省空间;若长度差异大或需要灵活操作,使用字符串数组。

Tips: MATLAB R2016b及以后的版本引入了字符串数组,使用双引号表示。字符串数组相比字符数组更为灵活,支持多种操作。

四、数组(Array)类型

4.1 数组(Array)类型简介

数组(Array) 是一种常见的 复合数据类型,是MATLAB最重要的数据结构之一,支持多维矩阵。数组可以是数值型、逻辑型、字符型以及其它类型(如结构体)。

Tips: 复合数据类型 是由一种或多种基本数据类型构成的,可以表示更复杂的数据结构。MATLAB主要的复合数据类型包括: 数组(Array)、结构体(Struct)和单元数组(Cell)。

数组可以是一维、二维或多维的。一维数组 通常称为 向量,二维数组 通常称为 矩阵

4.2 向量(Vector)

向量(Vector) 是一个一维数组,可以是行向量(row vector)或列向量(column vector),二者定义不同:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>> row_vector = [1, 2, 3]; % 行向量 
row_vector =
    1   2   3

>> column_vector = [1; 2; 3]; % 列向量
column_vector =
    1
    2
    3
>>

4.3 矩阵(Matrix)

矩阵(Matrix) 是一个二维数组,其内部的每个元素都是相同数据类型。

1
2
3
4
5
6
>> matrix = [1, 2, 3; 4, 5, 6]; % 创建一个2x3矩阵

matrix =

    1.0000 2.0000 3.0000
    4.0000 5.0000 6.0000

4.4 多维数组

多维数组 是拥有更多维度的数组。

1
>> three_d_array = rand(2, 3, 4); % 创建一个随机的2x3x4三维数组

4.5 元胞数组(cell)

在 MATLAB 中,元胞数组(cell) 是一个可以容纳不同类型元素的数据结构,类似于Python语言中的列表。

MATLAB 中 使用 {} 像定义矩阵一样定义元胞数组:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
%  方式一:
A = { [1 4 3; 0 5 8; 7 2 9] 'Anne Smith' ;3+7i -pi:pi:pi}


%  方式二:
A(1,1)={[1 4 3; 0 5 8; 7 2 9]};
A(1,2)={'Anne Smith'};
A(2,1)={3+7i};
A(2,2)={-pi:pi:pi};


%  方式三:
A{1,1}=[1 4 3; 0 5 8; 7 2 9];
A{1,2}='Anne Smith';
A{2,1}=3+7i;
A{2,2}=-pi:pi:pi;

上面三种方式是等价的。其中第二种方式使用单元索引赋值,而第三种方式使用内容索引赋值。

因为元胞数组的子集仍为元胞数组,索引器内容的使用,有必要指明要访问的的是一个子元胞数组还是元胞数组对应区域中的内容:

  • 使用单元索引(), 得到的是一个子元胞数组;
  • 使用内容索引{}, 得到的是元胞数组对应区域中的内容;

元胞数组的常用函数:

函数 作用
cell 创建一个元胞数组
iscell 判断某变量是否为元胞数组
cell2mat 将元胞数组转为矩阵
cell2struct 将元胞数组转为结构体
mat2cell 将数组转换为指定大小元胞数组
num2cell 将数组转换为相同大小的元胞数组
struct2cell 将结构体转换为元胞数组
celldisp 递归显示元胞数组中的内容
cellplot 以图像形式绘制元胞数组的结构
cellfun 对元胞数组的每个元胞应用某函数

其中 mat2cell函数 可以在转换的时候指定元胞数组各元胞的尺寸:

1
2
3
4
5
6
7
8
9
a = magic(3)

b = num2cell(a)
% 得到
% [8] [1] [6]
% [3] [5] [7]
% [4] [9] [2]

c = mat2cell(a, [1 2], [2, 1])

五、结构体(Struct)

5.1 Matlab 结构体(Struct)

结构体(struct) 是一种常见的 复合数据类型,在MATLAB中,结构体是一个存储{键: 值}的数据结构,类似于Python语言中的字典,用于存储不同类型和大小的数据集合。

5.2 结构体的基本使用

与大多数编程语言类似,MATLAB使用 . 来访问结构体中的字段:

1
2
3
4
5
6
7
student.name = 'John Doe';
student.id = 'jdo2@sfu.ca';
student.number = 301073268;
student.grade = [100, 75, 73; ...
                 95, 91, 85.5; ...
                 100, 98, 72];
student

alt text

对结构体列表使用下标表达式可以扩充或缩减结构体列表:

1
2
3
4
5
student(2).name = 'Ann Lane';
student(2).id = 'aln4@sfu.ca';
student(2).number = 301078853;
student(2).grade = [95 100 90; 95 82 97; 100 85 100];
student

alt text

结构体的常用函数:

函数 作用
struct 创建结构体
struct2cell 将结构体转换为元胞数组
cell2struct 将元胞数组转换为结构体
isstruct 判断某变量是否是结构体
structfun 对结构体的每个字段都应用某函数
fieldnames 获取结构体的所有字段名
isfield 判断结构体是否包含某字段
getfield 获取结构体某字段的值
setfield 为结构体中的某字段赋值
rmfield 删除结构体中的某字段
orderfields 为结构体字段排序

六、特殊数据类型

6.1 特殊数据类型简介

除上述各类数据类型外,MATLAB还支持一些特殊的数据类型,主要用于特定的应用场景,比如时间、数据表、图形等。

6.2逻辑值(logical)

逻辑值(logical) 的数据是指布尔类型的数据及数据之间的逻辑关系。 除了传统的数学运算, MATLAB还支持关系和逻辑运算。 这些运算的目的是提供求解 真/假 命题的答案。

作为所有关系和逻辑表达式的输入,MATLAB 把任何非零数值当作真,输出为1, 把零当作假, 输出为0。

逻辑类型数据进行运算时需要用到关系操作符和逻辑运算符。

6.2 时间和日期

MATLAB提供了多种表示时间和日期的数据类型,包括datetime和duration。

  • datetime:用于表示日期和时间,可以进行日期和时间的加减运算。
1
>> t = datetime('2023-01-01 12:00:00'); % 创建datetime对象

duration:用于表示时间间隔。

1
>> d = duration(1, 0, 0); % 表示1小时

6.3 表(table)

MATLAB中的表数据类型用于存储异构数据,表可以包含不同类型的列,非常适合数据分析和可视化工作。

1
T = table([1;2;3], ['Alice';'Bob';'Charlie'], 'VariableNames', {'ID', 'Name'});

6.4 分类数组(categorical)

分类数组用于处理具有重复值的分类数据,有助于提高计算效率和内存使用。这在统计建模和数据分析中十分重要。

1
categories = categorical({'Male', 'Female', 'Male', 'Female'});

七、判断变量数据类型的函数

下列函数可以对变量类型进行判断:

函数 作用
isinteger 判断输入参数是否为整型数数组
islogical 判断输入参数是否为逻辑量数组
isnumeric 判断输入参数是否为数值数组
isreal 判断输入参数是否为实数数组
ischar 判断输入参数是否为字符数组
iscell 判断输入参数是否为元胞数组
isfloat 判断输入数组是否为浮点数组
ishandle 判断输入数组是否有效的图形句柄
isempty 判断输入数组是否为空
isprime 确定哪些数组元素为质数
isnan 确定哪些数组元素为NaN
isinf 确定哪些数组元素为Inf
isequal 判断数组是否相等
Licensed under CC BY-NC-SA 4.0