![MATLAB R2020a从入门到精通(升级版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/74/38507074/b_38507074.jpg)
3.2 数据类型
MATLAB中定义了多种数据类型,包括整数、浮点数、复数、字符、字符串和逻辑类型等。用户甚至可以定义自己的数据类型。本节主要讨论数值数据类型,包括整数、浮点数和复数类型,以及在MATLAB中它们使用的方法。
3.2.1 整数类型
在MATLAB中,整数类型包含4种有符号整数和4种无符号整数。有符号整数可以用来表示负数、零和正整数,而无符号整数只可以用来表示零和正整数。
MATLAB支持1字节、2字节、4字节和8字节的有符号整数与无符号整数。这8种数据类型的名称、表示范围和类型转换函数如表3-5所示,在应用时要尽可能用字节数少的数据类型表示数据,这样可以节约存储空间和提高运算速度。
表3-5 8种数据类型的名称、表示范围和类型转换函数
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_13.jpg?sign=1739337951-d9z8af2reDaq14dKaGIG4JMq3Nsjd1WW-0-aea00bf72799f5ee4163af6bf31b7440)
例如,最大值为100的数据可以用1字节的整数来表示,而没有必要用8字节的整数来表示。
在表3-5中的类型转换函数可以用于把其他数据类型的数值强制转换为整数类型。此外,类型转换函数还可以用于生成整数类型。例如,如果需要产生一个无符号2字节整数的数值,可以用如下所示的语句实现:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_14.jpg?sign=1739337951-OdSaMHjs3vUxSL1x192vLwmmzqU4DAjt-0-0b6166dd30239d2dbafd8c1d2e277ae3)
如下所示的代码演示了基于相同整数类型之间的数学运算:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_15.jpg?sign=1739337951-WX4lV0pWJ5JzpmH4u9b0idnoMSDAUATk-0-91ff811c248013dde8bc08b01ee1d7a6)
在上述代码中,加法、减法和乘法都比较容易理解,除法稍微复杂一些,因为在多数情况下,整数的除法并不一定可以得到整数结果。
由于每种整数类型都有相应的取值范围,因此数学运算有可能产生结果溢出。MATLAB利用饱和处理此类问题,即当运算结果超出了由intmin和intmax指定的上下限时,就将该结果设置为intmin或intmax的返回值,到底是哪个,主要看溢出的方向,代码如下所示:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_16.jpg?sign=1739337951-oIQ1JgyNUpJppesYBQidc1Z15dTFwwHA-0-1cd0cd60cec1b132671f2213a7608084)
总之,MATLAB支持各种整数类型。除了64位整数类型,其他整数类型都具有比双精度类型更高的存储效率。基于同一整数类型的数学运算将产生相同数据类型的结果。
混合数据类型的运算仅限于在一个双精度标量和一个整数类型数组之间进行。有一点在前面的例子中没有演示,就是整数类型中不存在双精度类型中常见的Inf和NaN。
3.2.2 浮点数类型
MATLAB 中有双精度浮点数和单精度浮点数这两种浮点数。双精度浮点数是MATLAB默认的数据类型。
1.浮点数
如果某个数据没有被指定数据类型,那么MATLAB会使用双精度浮点数来存储。为了得到其他类型的数据,可以使用类型转换函数。
MATLAB中的双精度浮点数和单精度浮点数均采用IEEE 754规定的格式来定义。浮点数的存储大小、表示范围和类型转换函数如表3-6所示。
表3-6 浮点数的存储大小、表示范围和类型转换函数
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_17.jpg?sign=1739337951-WAOMDSFSr1nv7xj7xYaCPv4i0EjWucpI-0-fc7b11240327b63ec1c229de87b334f4)
创建单精度浮点数与前面创建整数的方法相同,示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_18.jpg?sign=1739337951-WhxURRspgTd2BKnj6JgyRVucW7WrSzNR-0-e7690cfd516af5581af3b12a384cfe5b)
单精度浮点数之间或单精度浮点数与双精度浮点数之间的数学运算结果为单精度浮点数,示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_19.jpg?sign=1739337951-H2MeRoR5XBFmsZaoKrrrctNVziWDEGPi-0-68db0f251e58476bedea0dd5efa45f88)
单精度浮点数中包含双精度浮点数中常见的特殊浮点数Inf和NaN,示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_20.jpg?sign=1739337951-uP3G19mAeihWIEeZ3BFKuZlkRZDVs59t-0-6702048ec34554622ff60485eb49fe01)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_21.jpg?sign=1739337951-cCMHWIYZdeHaG14nBYpnt3hkATazy2J7-0-9c9fbf57d872b96646c8d6629a624450)
2.特殊浮点数
NaN(非数值)和空数组([ ])是MATLAB中两类特殊的数据,在进行数学运算时,它们通常都要进行特殊处理,尤其是在逻辑运算或关系运算过程中。根据IEEE数学标准,对NaN进行运算的结果仍然是NaN,示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_22.jpg?sign=1739337951-GFscIpFuh2XvxKhJ68PM59iKEaW7Aai9-0-80f9c120b11d78635cdb5f6ba92af2ce)
如上述代码所示,第1条语句生成了一个含有NaN的向量a,第2条语句和第3条语句分别对向量a进行乘法和开方运算,从运算结果可以看到,对NaN进行数学运算的结果仍然是NaN。
第4条语句和第5条语句的结果或许有些出乎意料:由a==nan得到的结果全部是0(false),而由a~=nan得到的结果全部是1(true)。这个结果表明,在MATLAB中,不同的NaN之间是不相等的。
鉴于NaN的这种特性,在进行关系运算时,必须确定数组中是否含有NaN。MATLAB提供的内置函数isnan()专门用来寻找数组中是否含有NaN。如下所示的代码就是利用isnan()函数来寻找a中的NaN:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_23.jpg?sign=1739337951-aG6ByVU0XkBwTvUnjK2cAj7zRjeN3Yz7-0-c68402a39496d941d979d443ad6d30bd)
由结果可知,isnan()函数在数组中NaN的位置返回1(true)。另外,将isnan()函数和find()函数联合使用可以寻找数组中NaN的位置索引。例如,如下所示的代码先找到数组a中NaN的位置,然后在这些位置上用0替代NaN:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_24.jpg?sign=1739337951-xvjwP9YO8xCfSoUoUsxnAFaiXCgCfvb6-0-85bbc7c9af00f3e517f390946d70a6b5)
空数组是开发人员定义的一个数据类型(这一点与NaN不同,因为NaN是由IEEE标准定义的),是指一维或多维的长度为0的数组变量。
空数组的表达方式也很多,最简单的是直接用方括号表示的数组,即[ ]数组。如下所示的代码给出了几种空数组的创建方式,并用size()函数或length()函数查看它们的维数或长度:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_25.jpg?sign=1739337951-NcTYHG3nKONFaOCZ1AWtvfBmb8f1ybp6-0-745d41d2b26f09b4212fea3fbaefc74e)
使一个数组的维数为0也许会让读者感到困惑,但这在许多运算中是非常有用的,随着本书的深入,读者会对其有更深的了解。
空数组有时也出现在一些函数的返回参数中。在MATLAB中,很多函数在无法返回适当的结果时,往往会返回空数组,其中最典型的就是find()函数,具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_26.jpg?sign=1739337951-7tmM6REdKTzeFuTszaYw1dM89K3tuv3B-0-baec41a373a32174b37abc973d7ada48)
在上述示例中,数组x中不存在大于2的值,因此找不到正确的索引值,于是find()函数就返回一个空数组。可以使用isempty()函数测试一个返回值是否是空数组,具体示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_27.jpg?sign=1739337951-jkpM5ukKZ8MvWPRaVsLYmnjd82x7kM3x-0-435aee725933d30cb0b6c23e70038b81)
由于空数组也存在维数(如前面创建的c为0×5的数组),在MATLAB 7中,不同维数的空数组之间是不能进行比较的,因此,在验证一个数组是否是空数组时,最好不要使用关系运算,建议使用isempty()函数。例如,如果要验证前面创建的c是否是空数组,只能采用isempty()函数,代码如下所示:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_28.jpg?sign=1739337951-0xJU8clBu1tAhSOShA53RKB6TGHqjG6J-0-ce577e0cf443d804c2f17753d0ae378e)
当用户确认空数组是最简单的空数组([ ])时,关系运算也成立,只不过运算结果仍是空数组,示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_29.jpg?sign=1739337951-pH8iSLKBo5WzRTZbVHFCuHrd9re72FQx-0-9d01034502e105a546e6b8a653b0b605)
也可以将一个非空数组与一个空数组进行比较,结果返回一个空数组,示例如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_30.jpg?sign=1739337951-RTuFX4xUJZiAq3tbuFGMaxQEgd2AYcxK-0-551c58c9f8dda8bd0c224b6c7200cb6f)
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_31.jpg?sign=1739337951-0Z8z6UzlgjOitLvcJliW5d8cDSkiGQzj-0-1d956c65a415a1fb1df40bd279d438c9)
由上述示例可以看出,对空数组执行关系运算时,要么返回错误信息(如在两个不同维数的空数组之间进行比较时),要么返回一个空数组(如前面的两个示例),这通常都不是用户想要的结果,因此,当有空数组出现时,建议用户使用isempty()函数,尽量不要使用关系运算。
3.2.3 复数类型
复数是指既包含实部又包含虚部的数,复数出现在许多科研工作中。例如,在电力工程中,可以用复数代表交变电压、交变电流和阻抗。描述电气系统行为的公式经常用到复数。
作为一个工程师,如果无法很好地理解和运用复数,将无法工作。复数的一般形式如下:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_32.jpg?sign=1739337951-DEv849LpkDlyOMo30X3CV0y7luUqdGJF-0-6e42c9c14f51e879fe8a12831ad604bb)
其中,C为复数,a和b均为实数,i代表-1。a、b分别为C的实部和虚部。由于复数有两个部分,因此它能在平面内标出。这个平面的横轴是实轴,纵轴是虚轴,所以复数在这个平面内为一个点,横轴为a,纵轴为b。用上面的方式表示一个复数,称为直角坐标表示,坐标的横轴与纵轴分别代表复数的实部与虚部。
若复数在一个平面内,则有另一种表达方式,即极坐标表示,公式如下:
c = a + bi = z∠θ
其中,z代表复数的模,θ代表辐角。在直角坐标中,a、b和极坐标z、θ之间的关系如下:
a = z cosθ
b = z sinθ
z =( a2+b2)1/2
θ = tan-1(b/a)
复数包含独立的两部分,即实部和虚部。虚部的单位是-1的平方根,在MATLAB中可以用i或j来表示。
可以用如下所示的赋值语句来产生复数:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_33.jpg?sign=1739337951-en6QKWRyaaqigsWTO0GZLEufqHq1Xxw7-0-050a804435d213fb1b53b4c0386a45de)
也可以用complex()函数来产生复数,代码如下所示:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_34.jpg?sign=1739337951-h8Ey9KcAqATViJGrfgqHlEMSHZMdItxu-0-02bb9a471bf2bcedf98dc3d193b3fbba)
其中,x、y为实数,得到的z是以x为实部、y为虚部的复数。
也可以按照如下形式使用complex()函数,具体代码如下所示:
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_35.jpg?sign=1739337951-2Ak403SYaNIQZGYtGkXZ9f8rRQ1le70j-0-41068028fb97c01287643bf1c7dd3fd3)
其中,x为实数,得到的z是以x为实部、0为虚部的复数。
常见的支持复数运算的MATLAB函数如表3-7所示。
表3-7 常见的支持复数运算的MATLAB函数
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_36.jpg?sign=1739337951-yTQ6fjg75ZHJXPbM1pbZHFe6ihnCwEDB-0-ae9fab4d6a34e6e76fcb2d4dbbe162a8)
在本节的最后,将上述介绍过的数据类型汇总成表(见表3-8),给出适合MATLAB支持的数据类型函数。
表3-8 数据类型函数
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_37.jpg?sign=1739337951-j6Oz6c12jRMcZmBSQfs6XiBcE7XZhYJs-0-568333e8d95c552d8c9f3b14439c0ec3)
续表
![img](https://epubservercos.yuewen.com/FDADB4/20266983901431206/epubprivate/OEBPS/Images/txt004_38.jpg?sign=1739337951-E9VyzqbWx0n1lCuoIzIO4F620dJCYvW7-0-dca59777ba4bd683c6eab3a70b8bc4ee)