1.1 MATLAB有哪些主要的数据类型
1.1.1 数值类型
数值类型的数据主要有整数、单精度浮点数和双精度浮点数3类,如表1.1所示。
表1.1 数值类型数据的分类
经验分享:MATLAB中默认的数据类型是双精度浮点型,主要是为了尽量保留数据运算的精度。在某些对精度要求不太高但对数据存储空间有严格要求的运算情况下,用户可以根据自身的实际需求调整参与运算的数据的类型,在保证运算精度的前提下,满足存储空间有限的要求。
1.整数类型
从表1.1可以初步了解到,在MATLAB中整数格式的数据类型从存储占用位数、能表示的数值范围和转换函数3个方面可分为8种不同的内置数据类型,如表1.2所示。
表1.2 MATLAB中的整数类型
上文中已经提及,MATLAB中数值的默认数据类型是双精度浮点类型。因此,当用户需要使用整数数据类型时,其可以通过转换函数实现数据类型的转换,如图1.1所示。其中,%以后的文字为注释部分,ans是MATLAB中用以存储当前运算结果的临时变量,是answer的英文缩写。
图1.1 数值类型转换
每一个转换函数都有一个相应的所能表示的数值范围。当被转换的数值在此范围以外时,MATLAB将以距离该数值最近的范围界限来表示转换结果,如图1.2所示。
经验分享:在对数值进行数据类型转换时,需要转换函数的数值表示范围,避免因在数值表示范围以外进行数据类型转换操作而造成数据错误。在一些大型计算程序中,此类错误有可能因为在MATLAB中无法被检验出来而造成灾难性的后果。
图1.2 超出数值范围的数值类型转换
2.浮点数据类型
MATLAB中提供了单精度浮点数类型和双精度浮点数类型,在存储位宽、能够表示的数值范围、数值精度各方面均不相同,具体如表1.3所示。
表1.3 MATLAB中浮点数类型
与整数型数值类似,单精度与双精度类型的数值分别具有对应的转换函数。尽管在MATLAB中,数值的默认数据类型是双精度浮点型,但是在该型数值参与运算时,运算结果的类型却取决于参与运算的其他数据的类型。参与运算的其他数据是逻辑型、字符型时,返回结果为双精度浮点型;参与运算的其他数据是整型,则返回结果为相应的整数类型;参与运算的其他数据为单精度浮点型,则返回结果也为相应的单精度浮点型。所以,在MATLAB默认的情况下,参与运算的数值为双精度浮点数,运算结果也为双精度浮点数。然而,一旦用户使用了上述的整数转换函数或浮点数转换函数以后,参与运算的数值有可能出现“混合数值类型”的状况,其运算结果的类型也不尽相同,如图1.3所示。
经验分享:在MATLAB中,整数与单精度浮点数进行算术运算会出现错误。
3.复数类型
复数由实部和虚部两部分组成,在MATLAB中默认使用字母i或j作为虚部标志。在MATLAB中创建复数时,用户可以直接按照复数形式在命令行窗口中进行输入,或直接在命令行窗口调用complex函数创建,如图1.4所示。
图1.3 混合数值类型运算
图1.4 复数类型数值的生成
MATLAB为用户提供了与复数生成与运算相关的函数,如图1.5所示。
图1.5 MATLAB中与复数相关的函数
4.无穷量与非数值量
MATLAB可以表示无穷量(Inf)与非数值量(NaN)。正、负无穷量在MATLAB中分别使用Inf(infinity)或-Inf表示,而非数值量则用NaN(Not-a-Number)表示。正负无穷量一般在MATLAB运算发生溢出时产生,所产生的结果是超出双精度浮点数数值的范围,而NaN则是由异常的运算而产生的。无穷量与非数值量的表示如图1.6所示。
图1.6 产生无穷量与非数值量的展示
1.1.2 逻辑类型
逻辑类型数据是指只具有“真”、“假”两种值的反映数据之间的布尔逻辑关系的布尔类型数据。一般情况下,习惯于用1表示“真”,0表示“假”。MATLAB支持关系和逻辑运算。
对于所有关系和逻辑运算表达式而言,MATLAB把所有非零数值(大于零和小于零的数值)的输入当作“真”,而只把零值当作“假”;而对于输出而言,“真”输出为1, “假”输出为0。
MATLAB提供了关系操作符与逻辑运算符,逻辑类型数据由上述运算符连接而参与关系和逻辑运算。MATLAB提供的关系操作符如表1.4所示,这些关系操作符可用来进行两个长度相同的数组比较,或者数组与标量的比较,比较操作演示如图1.7所示。
表1.4 MATLAB中的关系操作符
图1.7 关系操作符使用演示
经验分享:在图1.7中演示的关系操作符表达式中,通过TorF变量的形式可以看出,当参加逻辑运算的元素是一个数组与一个标量时,实际是数组的元素与该标量进行一一比较;当参加逻辑运算的元素是两个长度相同的数组时,实际参与比较的是两个数组同一位置上的两个元素。
上文所提及的MATLAB中提供的逻辑运算符,如表1.5所示。逻辑运算符使用演示如图1.8所示。
表1.5 MATLAB中的逻辑运算符
图1-8 逻辑运算符使用演示
经验分享:在逻辑运算符中,“(按位)与”与“(按位)或”运算符的运算对象至少应该是2个,而“(按位)非”运算符的运算对象只能是1个。
除了上述的关系操作符与逻辑运算符以外,MATLAB还提供了大量的测试函数,用以测试在运算过程中产生的特殊值是否存在或条件是否成立,并返回相应的逻辑值结果。测试函数如表1.6所示。
表1.6 MATLAB中的测试函数
1.1.3 字符和字符串
在MATLAB中,文本可以通过字符或字符串来表示。其中,字符串被存储到一个行向量中,它的每个元素依次为组成该字符串的字符。在计算机里,显示在屏幕上的英文字符与机器内部的ASCII码相对应,在MATLAB中,字符也与ASCII码相对应。如图1.9所示为字符串表达式的演示。
图1.9 字符串表达式演示
在图1.9演示的过程中,使用了两个MATLAB中常用的函数size(A)与abs(A)。如果A是一个数组,则前者返回数组的大小,后者返回数组元素的绝对值。
1.1.4 结构体类型
在MATLAB中,结构体类型数据可以存储多个不同类型的数据,相当于是一个数据容器,可以把多个相关联的不同类的数据封装在一个结构体对象中。MATLAB是通过结构体中的字段来存储不同类的数据的。
MATLAB为用户提供了两种创建结构体对象的方法:第一种是通过直接给结构体字段赋值的方式创建(如图1.10所示);第二种是通过调用struct函数创建。
经验分享:用如图1.10所示的直接给字段赋值的方式创建结构体时,遵循一种基本模板——“结构体名称.字段名称”。对于同一个结构体对象而言,在创建的时候,结构体名称必须保持一致,而用户可以根据具体的需求添加任意多个字段,并对其赋予相应类型的值。
图1.10 直接给字段赋值创建结构体
1.1.5 数组与矩阵类型
数组类型是MATLAB中广泛使用的一种数据类型,数组的运算实质上是数组元素对元素的运算,而矩阵的运算则遵循线性代数的运算方式。此处仅介绍数组类型,矩阵类型将在第2章详细介绍。
在MATLAB中,数组是广义上的数组,即数组的元素并不一定是数值类型,也可以是字符串类型或指针类型等。MATLAB为创建数组类型数据提供了多种方法,几种常见的形式如图1.11所示。
图1.11 几种常见的创建数组方法
经验分享:如图1.11所示,其中的等差数列式数组创建方法适用于元素按照等差数列方式排列的情况;否则,如果数组元素分布具有随机性,则需要使用枚举式创建数组。在创建等差数列式时,如果步长为1,则表达式可以省略步长参数,仅提供首尾元素;否则,步长不可省略。
1.1.6 单元数组类型
MATLAB提供了一种特殊的数组类型,即单元(cell)数组类型。它是一种广义的矩阵,构成它的每一个元素称为一个单元,而每个单元里可以存储一个任意类型的数组,如数值数组、字符串数组、结构体数组或另外一个单元数组,所以相应地,每个单元的尺寸与占用的内存空间也可以不一样。因此,当用户需要在一个数组里存放不同类型数组时,单元数组是最好的选择。
MATLAB为创建单元数组提供了两种方法:枚举式直接赋值法与调用cell函数法。
(1)枚举式直接赋值法,即通过一般的赋值语句来枚举单元数组中的所有单元的值,从而直接创建单元数组。尽管单元数组是一种广义矩阵,但是与一般用中括号“[]”的数组有区别——单元数组使用花括号“{}”界定数组内元素。单元数组内部单元的分隔符与一般数组一样,即单元之间使用逗号“, ”或者空格来分隔,使用分号“; ”来分行。具体创建过程演示如图1.12所示。
图1.12 枚举式直接赋值法创建单元数组演示
(2)调用cell函数法,通过MATLAB提供的库函数cell来创建一个“[]”的空单元数组demo_cell,其中每个单元都是空矩阵。然后,通过demo_cell{i, j}下标访问demo_cell中的单元并对单元赋值,同样也能得到与图1.12中所示的单元数组,如图1.13所示。
图1.13 调用cell函数创建空单元数组
1.1.7 map容器类型
map容器类型是从MALTLAB R2012a版本开始新增加的数据类型。从字面上来理解,map表示的是一种量与量之间的映射关系,由此建立起一种唯一的一一对应的“键值(key-value)”对关系,用户可以通过“键”来快速寻访与其绑定的“值”。
一个map是map类的一个对象。对于所有的map类而言,其所有对象都具有3种属性,如表1.7所示。用户只能通过作用于map类的函数对map的属性进行修改。
表1.7 map类对象的属性