2.1 数值数据及操作

MATLAB的数据类型包括逻辑类型(logical)、字符类型(char)、数值类型(numeric)、表类型(table)、单元类型(cell)和结构类型(struct)等,如图2.1所示。各种数据类型之间可以相互转换。数值类型又分为整形(包含 int8、int16、int32、int64等)和浮点型(single和double)。丰富的数据类型增强了 MATLAB 的数据表达能力,给应用带来了方便。

图2.1 MATLAB的数据类型

使用合理类型和操作来存储和处理数据,可以提高内存空间的使用效率和程序的执行速度。

2.1.1 数值数据

数值数据是科学计算中最常见、应用最多的数据。MATLAB中的数值类型包括有符号和无符号整数、单精度和双精度浮点数。默认情况下,MATLAB会将数值数据按双精度浮点(double)类型存储和处理。存储大量的数值数据时,与双精度数组相比,以整数和单精度数组形式存储数据更节省内存。

1. 数值数据类型

(1)整型

MATLAB支持以1字节、2字节、4字节和8字节几种形式存储整数数据。以8位无符号整数为例,该类型数据在内存中占用1字节,可描述的数据范围为0~255。表2.1列出了各种整型数据的取值范围和将浮点型数据转换为该类型数据的转换函数。

表2.1 MATLAB的整型数据

MATLAB默认以双精度浮点形式存储数值数据。要以整数形式存储数据,则可以使用表2.1中的转换函数。例如,以下命令将数12345以16位有符号整数形式存储在变量x中:

x=int16(12345);

使用表2.1中的转换函数将浮点型数据转换为整数时,MATLAB将舍入到最接近的整数。如果小数部分正好是0.5,则 MATLAB 会从两个同样临近的整数中选择绝对值更大的整数。例如:

>> x=int16([-1.5, -0.8, -0.23, 1.23, 1.5, 1.89])

x =

  1×6 int16 行向量

   -2  -1  0  1  2  2

此外,MATLAB 还提供了4种转换函数,用于采取指定方式将浮点型数据转换为整型数据。

● round函数:四舍五入为最近的小数或整数。

● fix函数:朝零方向四舍五入为最近的整数。

● floor函数:朝负无穷大方向四舍五入。

● ceil函数:朝正无穷大方向四舍五入。

例如:

>> x=round([-1.5, -0.8, -0.23, 1.23, 1.5, 1.89])

x =

  -2  -1   0   1   2   2

>> x=fix([-1.5, -0.8, -0.23, 1.23, 1.5, 1.89])

x =

  -1   0   0   1   1   1

>> x=floor([-1.5, -0.8, -0.23, 1.23, 1.5, 1.89])

x =

  -2  -1  -1   1   1   1

>> x=ceil([-1.5, -0.8, -0.23, 1.23, 1.5, 1.89])

x =

  -1   0   0   2   2   2

(2)浮点型

浮点型用于存储和处理实型数据,分为单精度(single)和双精度(double)两种。单精度型数在内存中占用4个字节,双精度型数在内存中占用8个字节,双精度型数精度更高。

single函数和double函数分别用于将其他数值数据、字符或字符串及逻辑数据转换为单精度型值和双精度型值。

(3)复型

复型数据包括实部和虚部两个部分,实部和虚部默认为双精度型。在MATLAB中,虚数单位用i或j表示。为了提高复数算术运算的速度和可靠性,MATLAB建议使用1i和1j来代替i和j。

当所创建的复数实部或虚部是非浮点型数时,使用complex函数生成复数,例如:

>> complex(3,int8(4))

ans =

  int8

   3 + 4i

可以使用real函数获取复型数的实部值,使用imag函数获取复型数的虚部值。

2.判别数据类型

在MATLAB中,可以使用表2.2中的函数判别数据是否为指定类型。

表2.2 判别数值数据类型的函数

调用这些函数时,如果函数参数属于该类型,返回值为1,否则返回值为0。例如:

>> isinteger(1.23)

ans =

  logical

   0

也可以使用isa函数判别数据对象是否为指定类型,isa函数的调用格式如下。

isa(obj,ClassName)

其中,obj 是 MATLAB 数据对象,ClassName 是 MATLAB 类或基础类名,如果 obj 属于ClassName类,isa函数的返回值为1,否则返回值为0。例如:

>> isa(1.23,'double')

ans =

  logical

   1

还可以使用class函数获取某个数据对象的类型,函数的返回值是一个字符串。例如:

>> class(1.23)

ans =

  'double'

3.获取特殊值

在MATLAB中,可以使用表2.3中列出的函数获取数据对象的特殊值。

表2.3 获取数值数据特殊值的函数

表2.3中的函数调用格式相似,下面以eps函数为例进行说明,调用格式如下:

eps

eps(x)

eps(datatype)

其中,第一种格式返回从1.0到一个与1.0最接近的双精度数的距离,即eps=2−52。第二种格式返回从x的绝对值到一个与x最接近的浮点数的距离,若x为1,返回值与第一种格式的返回值相同。第三种格式返回从1.0到一个与1.0最接近的 datatype 类型数的距离,datatype 可以是'double’ 或 ’single'。例如:

>> d=eps

d =

   2.2204e-16

>> d=eps('single')

d =

  single

  1.1921e-07

2.1.2 数据的输出格式

MATLAB 用十进制数表示一个常数,采用日常记数法和科学记数法两种表示方法。例如, 1.23456、−9.8765i、3.4 + 5i等是采用日常记数法表示的常数,它们与通常的数学表示一样。又如, 1.56789e2、1.234e−5−10i 等采用科学记数法表示常数1.56789×102、1.234×10−5−10i,在这里用字母e或E表示以10为底的指数。

MATLAB 中,数值类型的数据默认是用双精度数来表示和存储的。数据输出时用户可以用“format”命令设置或改变数据输出格式。“format”命令的格式为

format 格式符

其中,格式符决定数据的输出格式,各种格式符及其含义如表2.4所示。

表2.4 控制数据输出格式的格式符及其含义

续表

假定执行“x=[4/3 1.2345e-6];”命令,那么,在各种不同的格式符下的输出如下。

短格式(short):1.3333 0.0000

短科学记数法(shortE):1.3333e+00 1.2345e-06

长格式(long): 1.333333333333333 0.000001234500000

长科学记数法(longE):1.333333333333333e+00 1.234500000000000e-06

十六进制格式(hex):3ff5555555555555 3eb4b6231abfd271

+格式(+):++

银行格式(bank):1.33 0.00

“format”命令只影响数据输出格式,而不影响数据的计算和存储。

hex 输出格式是把计算机内部表示的数据用十六进制数输出。对于整数不难理解,但对于单精度或双精度浮点数(MATLAB默认的数据类型),就涉及数据在计算机内部的表示形式。这是一个不太容易理解的问题,下面简要说明。

单精度浮点数在内存中表示为4个字节(32位)二进制数,其中1位为数据的符号位(以0代表正数,1代表负数),8位为指数部分,23位为尾数部分,如图2.2所示。指数部分表示2的幂次,存储时加上127,也就是说20用127(即二进制1111111)表示。尾数部分是二进制小数,其所占的23位是小数点后面的部分,小数点前面还有个隐含的1并不存储。

双精度浮点数为64位二进制,其中1位为符号位,11位为指数部分,52位为尾数部分,其存储方式与单精度数类似,请读者自行分析。

图2.2所示说明了以下命令的输出结果:

>> format hex;

>> single(-4.25)    %将-4.25转换为单精度浮点数

ans =

single

  c0880000

图2.2 单精度浮点数在计算机内部的表示形式