PSYCHTOOLBOX工具箱及MATLAB编程实例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 数据类型

MATLAB支持多种数据类型,并且对不同数据类型的处理提供了丰富的函数,而且还可以自定义数据类型,合理地使用不同类型的数据,一方面可以节省内存的占用空间,另一方面也可以使程序编制事半功倍。

2.1 数值型

数值型包括整数、浮点数和复数。

1.整数

整数又因能够容纳的数值大小的不同分为不同位数的有无符号的整数。由于计算机采用二进制编码,因此1个字节可以容纳28个数,2个字节可以容纳216个数,4个字节可以容纳232个数等。不同类型的整数表示的范围见表2-1。如果表示分值介于0~150之间的功课成绩,则可以使用无符号8位整数;如果要表示一个国家的人口数,则可以使用无符号32位整数(大约可以表示42.9亿),整数表示范围如表2-1所示。

表2-1 整数的表示范围

由于MATLAB 默认的数据类型为双精度浮点数,使用表2-1 中的转换函数可以创建相应的整数类型,例如

>> a=uint8(93);↙
>> b=int16(327);↙
>> c=int32([76 89]);↙
>> d=1;↙
>> whos↙
Name     Size          Bytes  Class   Attributes
  a       1x1           1      uint8
  b       1x1           2      int16
  c       1x2           8      int32
  d       1x1           8      double

通过whos命令可列出当前工作区中所定义的变量信息,其中Name栏为变量名,Size栏为行列数,如变量c有1行2列数据;Bytes栏为占用的总字节数;Class为数据类型,Attributes为属性。

如果数值超出了某种数值类型所能表示的范围,则取该类型能够表示的最大值或最小值,例如,

>> int8(300)↙
ans =
  127

转换函数还可以将其他数据类型转换成整型,例如

>> a=970;uint16(a);↙
>> whos↙
Name       Size        Bytes  Class     Attributes
  a        1x1         8      double
  ans      1x1         2      uint16

甚至还可以将字符型数据转换为整型,例如,

>> str='Hello Matlab';int8(str)↙
ans =
  72  101  108  108  111  32  77  97  116  108  97  98

转换后的整数为相应字母的ASCII码。如果是中文字符,则需要能够包含65535在内的数值类型(如uint16或int32等),例如

>> uint16('你好,我的实验')↙
ans =
  20320  22909  65292  25105  30340  23454  39564

函数isinteger可以验证某变量是否为整数,例如

>> a=15;isinteger(a)↙
ans =
    0

使用函数class可以获知某数据的类型

>> a=uint8(15);class(a)↙
ans =
uint8

2.浮点数

浮点数又可以分为单精度(single)和双精度(double),区别在于表示的数值范围不同,单精度浮点数的存储需要32位,可以表示的数值范围为(−3.4028234663852886e+038~−1.1754943508222875e-038)和(1.1754943508222875e-038 ~3.4028234663852886e+038),双精度数的存储需要 64 位,可以表示的数值范围为(−1.7976931348623157e+308~−2.2250738585072014e-308)和(2.2250738585072014e-308~1.7976931348623157e+308),由此可见,尽管浮点数所能表示的数值范围不包括零在内,但0.0是浮点数的特例。由于 MATLAB 默认的数据类型为双精度浮点数,所以直接赋值操作就将某变量定义为了双精度浮点数,如果要定义单精度浮点数,则需要使用single转换函数,与双精度浮点数对应的转换函数为double。例如

>> x=48.95;↙
>> y=single(x);↙
>> z=double(y);↙
>> whos↙
Name     Size          Bytes  Class    Attributes
x        1x1           8     double
y        1x1           4     single
z        1x1           8      double

利用realmin和realmax函数可以获取双精度浮点数的最小值和最大值,单精度浮点数的最小值和最大值使用'single'作为上述函数的参数即可,例如

>> realmin↙
ans =
  2.2251e-308
>> realmax('single')↙
ans =
  3.4028e+038

函数isfloat检验某个变量或数是否为浮点数。

3.复数

复数包括:实数部分和虚数部分,直接以x+yi的形式输入或使用complex函数定义复数,例如

>> x=5+3i↙
x =
  5.0000 + 3.0000i
>> y=complex(15,30)↙
y =
  15.0000 +30.0000i

利用函数real和imag可以获取复数的实数部分和虚数部分,例如

>> x=complex(rand(3),rand(3))↙
x =
  0.7952 + 0.6551i  0.4456 + 0.4984i  0.7547 + 0.5853i
  0.1869 + 0.1626i  0.6463 + 0.9597i  0.2760 + 0.2238i
  0.4898 + 0.1190i  0.7094 + 0.3404i  0.6797 + 0.7513i
>> real(x)↙
ans =
    0.7952   0.4456   0.7547
    0.1869   0.6463   0.2760
    0.4898   0.7094   0.6797
>> imag(x)↙
ans =
    0.6551   0.4984   0.5853
    0.1626   0.9597   0.2238
    0.1190   0.3404   0.7513

除此之外,MATLAB中使用inf表示无穷大数,NaN表示非数值,即不是一个数。如以0作被除数时会产生无穷大,而无穷大除以无穷大或0除以0会产生非数值,

>> 5/0↙
ans =
  Inf
>> 0/0↙
ans =
NaN
>> inf/inf↙
ans =
NaN

可以使用isinf和isnan函数来检验某数是否是无穷大或非数值。