第2章 MATLAB基础知识
知识要点
MATLAB是一个大型运算平台,参与运算的对象有数据流、信号流、逻辑关系等。如同计算器一样,在MATLAB中数学式的计算是直截了当的。但要了解这个大型计算器的使用方法并合理使用它,就先要了解一些MATLAB的基础知识。本章是整个MATLAB学习的基础,主要内容包括MATLAB软件平台上的各种数据类型、矩阵的基本操作、运算符及字符串处理函数等。
学习要求
2.1 数据类型(1)
MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这6种基本的数据类型都是按照数组形式存储和操作的。
MATLAB中还有两种用于高级交叉编程的数据类型,分别是用户自定义的面向对象的用户类类型和Java类类型。
2.1.1 数值类型
基本的数值类型主要有整数、单精度浮点数和双精度浮点数,如表2-1所示。
表2-1 数值类型数据的分类
MATLAB中数值类型的数据包括有符号和无符号整数、单精度浮点数和双精度浮点数。在未加说明与特殊定义时,MATLAB对所有数值按照双精度浮点数类型进行存储和操作。
在需要时,可以指定系统按照整数类型或单精度浮点数类型对指定的数字或数组进行存储、运算等操作。相对于双精度浮点数类型,整数类型与单精度浮点数类型的优点在于节省变量占用的内存空间,当然要在满足精度要求的前提下。
提示:MATLAB会自动进行记忆体的使用和回收,而不像C语言,必须由使用者一一指定。这些功能使得MATLAB易学易用,使用者可专心致力于撰写程序。
1.整数类型
MATLAB中提供了8种内置的整数类型,这8种整数类型的存储占用位数、能表示的数值范围和转换函数均不相同,如表2-2所示。
不同的整数类型所占用的位数不同,因此能够表示的数值范围也不同。在实际应用中,应根据实际需要合理选择合适的整数类型。
由于MATLAB中数值的默认存储类型是双精度浮点数类型,因此将变量设置为整数类型时,需要使用相应的转换函数,将双精度浮点数转换为指定的整数类型。
表2-2 MATLAB中的整数类型
整数类型 |
数值范围 |
转换格式 |
有符号8位整数 |
-27~27-1 |
int8 |
无符号8位整数 |
0~28-1 |
uint8 |
有符号16位整数 |
-215~215-1 |
int16 |
无符号16位整数 |
0~216-1 |
uint16 |
有符号32位整数 |
-231~231-1 |
int32 |
无符号32位整数 |
0~232-1 |
uint32 |
有符号64位整数 |
-263~263-1 |
int64 |
无符号64位整数 |
0~264-1 |
uint64 |
在转换过程中,MATLAB默认将待转换数值转换为与之最为接近的整数值,若小数部分为0.5,则转换后的结果为与该浮点数最接近的两个整数中绝对值较大的一个。
另外,这些转换函数也可以将其他数据类型转换为指定的数据类型。在不超出数值范围的情况下,任意两个整数类型之间也可以通过转换函数进行相互转换。同时,由于不同的整数类型能够表示的数值范围不同,因此当运算结果超出相应的整数类型能够表示的范围时,就会出现错误,运算结果被置为该整数类型能够表示的最大值或最小值。
MATLAB中还包含了几类不同运算法则的取整函数,也可以把浮点数转换成整数。这些取整函数及相应的转换方式如表2-3所示。
表2-3 MATLAB中的取整函数
函数 |
运算法则 |
示例 |
floor(x) |
向下取整 |
floor(1.2)=1 floor(2.5)=2 floor(-2.5)=-3 |
ceil(x) |
向上取整 |
ceil(1.2)=2 ceil(2.5)=3 ceil(-2.5)=-2 |
round(x) |
取最接近的整数 如果小数部分是0.5,则向绝对值大的方向取整 |
round(1.2)=1 round(2.5)=3 round(-2.5)=-3 |
fix(x) |
向0取整 |
fix(1.2)=1 fix(2.5)=2 fix(-2.5)=-2 |
2.浮点数类型
MATLAB中提供了单精度浮点数类型和双精度浮点数类型,其存储位宽、能够表示的数值范围、数值精度各方面均不相同,具体如表2-4所示。
由表2-4可知,单精度浮点数类型的占用位数少,因此占用内存小,但能够表示的数值范围和数值的精度都比双精度浮点数类型小。
由于MATLAB中的默认数值类型为双精度浮点数类型,因此与创建整数类型数值一样,也可以通过转换函数来实现创建单精度浮点数类型。
表2-4 MATLAB中的浮点数类型
浮点数类型 |
存储位宽 |
各数位的意义 |
数值范围 |
转换函数 |
单精度 |
32 |
0~22位表示小数部分 23~30位表示指数部分 31位表示符号(0正1负) |
-3.40282e+038~-1.17549e-038 1.17549e-038~3.40282e+038 |
single |
双精度 |
64 |
0~51位表示小数部分 52~62位表示指数部分 63位表示符号(0正1负) |
-1.79769e+308~-2.22507e-308 2.22507e-308~1.79769e+308 |
double |
双精度浮点数在参与运算时,返回值的类型依赖于参与运算的其他数据类型。当参与运算的其他数据为逻辑类型、字符类型时,返回结果为双精度浮点数类型;当参与运算的其他数据为整数类型时,返回结果为相应的整数类型;当参与运算的其他数据为单精度浮点数类型时,返回结果为相应的单精度浮点数类型。
提示:在MATLAB中,单精度浮点数类型不能与整数类型进行算术运算。
例2-1:浮点数参与的运算。
在命令行窗口中输入:
a = uint32(120); b = single(22.809); c = 73.21; ab = a * b
输出结果:
错误使用 * 整数只能与同类的整数或双精度标量值组合使用。
在命令行窗口中输入:
ac = a * c
输出结果:
ac = uint32 8785
在命令行窗口中输入:
bc = b * c
输出结果:
bc = single 1.6698e+03
在命令行窗口中输入:
str = ‘hello’
输出结果:
str = 'hello'
在命令行窗口中输入:
newstr = str – 44.3
输出结果:
newstr = 59.7000 56.7000 63.7000 63.7000 66.7000
在命令行窗口中输入:
whos
输出结果:
Name Size Bytes Class Attributes a 1x1 4 uint32 ac 1x1 4 uint32 b 1x1 4 single bc 1x1 4 single c 1x1 8 double newstr 1x5 40 double str 1x5 10 char
由于浮点数只占用一定的存储位宽,其中只有有限位分别用来存储指数部分和小数部分,因此,浮点数类型能够表示的实际数值是有限且离散的,任何两个最近相邻的浮点数之间都有微小间隙,而处在间隙中的数值只能用这两个相邻的浮点数之中的一个来表示。MATLAB中提供了eps函数,可以获取一个数值和最接近该数值的浮点数之间的间隙。
例2-2:浮点数的精度。
在命令行窗口中输入:
format long eps(3)
输出结果:
ans = 4.440892098500626e-16
在命令行窗口中输入:
eps(single(3))
输出结果:
ans = single 2.3841858e-07
3.复数
复数包括实部和虚部两部分。MATLAB中默认使用字符i或j作为虚部标志。在创建复数时,可以直接按照复数形式进行输入或者使用complex函数。MATLAB库函数中关于复数的相关函数如表2-5所示。
表2-5 MATLAB库函数中关于复数的相关函数
函数 | 说明 |
real(z) | 返回复数z的实部 |
abs(z) | 返回复数z的模 |
conj(z) | 返回复数z的共轭复数 |
imag(z) | 返回复数z的虚部 |
angle(z) | 返回复数z的辐角 |
complex(a,b) | 以a为实部、b为虚部创建复数 |
4.无穷量(Inf)和非数值量(NaN)
MATLAB中使用Inf和-Inf分别代表正无穷量和负无穷量,NaN表示非数值量。正负无穷量的产生一般是由于运算溢出,产生了超出双精度浮点数数值范围的结果;非数值量则是由于0/0或Inf/Inf类型的非正常运算而产生的,这两个NaN彼此是不相等的。
除了异常运算结果,MATLAB还提供了特定函数Inf和NaN来创建指定数值类型的无穷量和非数值量,生成结果默认为双精度浮点数类型。还有一种特殊的指数类型的数据叫作非数,通常表示运算得到的数值结果超出了运算范围。非数的实部用NaN表示,虚部用InF表示。
例2-3:无穷量及非数值量的产生和性质。
在命令行窗口中输入:
a = 0 / 0, b = log(0), c = inf - inf
输出结果:
a = NaN b = -Inf c = NaN
2.1.2 逻辑类型
逻辑类型的数据是指布尔类型的数据及数据之间的逻辑关系。除了传统的数学运算,MATLAB还支持关系和逻辑运算。这些运算的目的是提供求解真/假命题的答案。
作为所有关系和逻辑表达式的输入,MATLAB把任何非零数值当作真,把零当作假。所有关系和逻辑表达式的输出:对于真,输出为1;对于假,输出为0。
逻辑类型数据在进行运算时需要用到关系操作符和逻辑运算符。
MATLAB中的关系操作符如表2-6所示。
表2-6 MATLAB中的关系操作符
关系操作符 |
说明 |
< |
小于 |
<= |
小于或等于 |
> |
大于 |
>= |
大于或等于 |
== |
等于 |
~= |
不等于 |
MATLAB中的关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量。在后一种情况中,标量和数组中的每一个元素相比较,结果与数组大小一样。
例2-4:判断两个数组中的元素是否相等。
在命令行窗口中输入:
A = 1 : 9, B = 10 - A
输出结果:
A = 1 2 3 4 5 6 7 8 9 B = 9 8 7 6 5 4 3 2 1
在命令行窗口中输入:
TrueorFalse = (A == B) %判断A与B中的元素是否相等
输出结果:
TrueorFalse = 1×9 logical 数组 0 0 0 0 1 0 0 0 0
提示:“=”和“==”在MATLAB中的意义是不同的。“==”是对等号两边的两个变量进行比较,当它们相等时返回1,不相等时返回0;而“=”则被用来将运算的结果赋给一个变量。
逻辑运算符提供了一种组合或否定关系表达式,如表2-7所示。
表2-7 MATLAB中的逻辑运算符
逻辑运算符 |
说明 |
& |
与 |
| |
或 |
~ |
非 |
例2-5:判断两个数组中的元素是否相等。
在命令行窗口中输入:
A = 1 : 9; TrueorFalse = ( A > 2 ) & ( A < 6) %判断A中元素是否在2~6之间
输出结果:
TrueorFalse = 1×9 logical 数组 0 0 1 1 1 0 0 0 0
除了上述关系操作符与逻辑运算符,MATLAB还提供了大量其他关系与逻辑函数。
(1)xor(x,y)指令的功能为异或运算,x和y同为零(假)或非零(真)时返回0,否则返回1。
(2)any(x)指令的功能为判断是否为零向量或零矩阵(向量或矩阵中的元素全部为零),如果是非零向量或非零矩阵,则返回1,否则返回0。
除此之外,MATLAB还提供了大量的函数,在运算过程中用来测试特殊值或条件是否存在,并返回相应的表示结果的逻辑值,如表2-8所示。
表2-8 测试函数
函数名称 |
函数功能 |
finite |
元素有限,返回空值 |
isempty |
参量为空,返回真值 |
isglobal |
参量是一个全局变量,返回真值 |
ishold |
当前绘图保持状态是“ON”,返回真值 |
isieee |
计算机执行IEEE算术运算,返回真值 |
isinf |
元素无穷大,返回真值 |
isletter |
元素为字母,返回真值 |
isnan |
元素为不定值,返回真值 |
isreal |
参量无虚部,返回真值 |
isspace |
元素为空格字符,返回真值 |
isstr |
参量为一个字符串,返回真值 |
isstudent |
MATLAB为学生版,返回真值 |
isunix |
计算机为UNIX系统,返回真值 |
2.1.3 字符和字符串
在MATLAB中,文本当作特征字符串或简单地当作字符串。字符串能够显示在屏幕上,也可以用来构成一些命令,这些命令在其他的命令中用于求值或者被执行。
在MATLAB中可能会遇到对字符和字符串的操作。一个字符串是存储在一个行向量中的文本,这个行向量中的每一个元素代表一个字符。实际上,元素中存放的是字符的内部代码,即ASCII码。
当在屏幕上显示字符变量的值时,显示出来的是文本,而不是ASCII数字。由于字符串是以向量的形式来存储的,因此可以通过它的下标对字符串中的任何一个元素进行访问。字符矩阵也可以通过下标索引进行访问,但是矩阵的每行字符数必须相同。
字符串一般是ASCII值的数值数组,它作为字符串表达式进行显示。
例2-6:字符串属性示例。
在命令行窗口中输入:
String = 'Every good boy does fun.'; size(String)
输出结果:
ans = 1 24
在命令行窗口中输入:
whos
输出结果:
Name Size Bytes Class Attributes String 1x24 48 char ans 1x2 16 double
一个字符串是由单引号括起来的简单文本。在字符串中的每个字符是数组中的一个元素,字符串的存储要求每个字符8字节,如同MATLAB的其他变量。
因为ASCII字符只要求1字节,故这种存储要求是浪费的,7/8所分配的存储空间无用。然而,对字符串保持同样的数据结构可以简化MATLAB的内部数据结构。所给出的字符串操作并不是MATLAB的基本特点,但这种表达是方便和可接受的。
为了了解下面字符串的ASCII表达,只需对字符串执行一些算术运算。最简单和计算上最有效的方法是取数组的绝对值。
例2-7:字符串的ASCII表达。
在命令行窗口中输入:
String = 'Every good boy does fun.'; U = abs(String)
输出结果:
U = 列 1 至 13 69 118 101 114 121 32 103 111 111 100 32 98 111 列 14 至 24 121 32 100 111 101 115 32 102 117 110 46
在命令行窗口中输入:
U = U + 0
输出结果:
U = 列 1 至 13 69 118 101 114 121 32 103 111 111 100 32 98 111 列 14 至 24 121 32 100 111 101 115 32 102 117 110 46
在上例中,加零到字符串并没有改变它的ASCII表达。
因为字符串是数值数组,所以它们可以用MATLAB中所有可利用的数组操作工具进行操作。
例2-8:字符串数组的索引示例。
在命令行窗口中输入:
String = 'Every good boy does fun.'; U = String(7:10)
输出结果:
U = 'good'
在命令行窗口中输入:
U = String(10:-1:7)
输出结果:
U = 'doog'
在上例中,字符串像数组一样进行编址。这里元素7~10包含单词good。
字符串中的单引号是由两个连续的单引号来表示的。
例2-9:字符串中的单引号。
在命令行窗口中输入:
String = 'It''s not the manual!'
输出结果:
String = 'It's not the manual!'
字符串的连接可以通过直接将字符串数组连接来实现。
例2-10:字符串的连接。
在命令行窗口中输入:
U = 'Hello,'; V = ' world!'; W = [U, V]
输出结果:
W = 'Hello, world!'