数学建模-Matlab学习笔记(四)
本文最后更新于:December 3, 2021 pm
MATLAB(矩阵实验室)是第四代高层次的编程语言和交互式环境数值计算,可视化和编程。由美国MathWorks公司开发的一种编程语言。用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。拥有众多的内置命令和数学函数,可以帮助您在数学计算,绘图和执行数值计算方法。
目录
1.MATLAT 的M文件
MATLAB允许写两个程序文件:一是脚本、二是函数。
脚本: 脚本文件 .m 扩展程序文件。在这些文件中写的一系列命令,想一起执行。脚本不接受输入和不返回任何输出。他们在工作区中的数据操作。
函数:函数文件 .m 扩展程序文件。函数可以接受输入和返回输出。内部变量是本地的函数。
.m 文件不一定要使用 MATLAB 编辑器创建,其他任何的文本编辑器也是可以的。MATLAB 命令和函数调用的脚本文件包含多个连续的行。可以运行一个脚本,在命令行中键入其名称。
1.1 脚本
1.1.1 创建并运行脚本文件
创建脚本文件,需要使用文本编辑器。MATLAB 编辑器,可使用两个方法:使用命令提示符、使用IDE。如果是在命令提示符下使用,键入编辑。这将打开编辑器。可以直接键入编辑,然后再文件名( .m 扩展程序文件名)。
1.1.1.1 命令提示符
1 |
|
这将在默认情况下,MATLAB 目录中创建文件。如果想存储在一个特定的文件夹中的所有程序文件,则一定要提供整个路径。
示例:创建一个文件夹名为 progs。
1 |
|
如果首次创建的文件,MATLAB 会提示您进行确认。单击“Yes”。
1.1.1.2 IDE
选择 NEW -> Script。这也打开编辑器,并创建一个文件名为命名。输入代码后可以命名并保存文件。创建和保存文件后,可以运行在两个方面:编辑器窗口中单击“Run”按钮、只要在命令提示符下键入文件名(不含扩展名)即可,如:>> prog1。
2.MATLAB 数据类型
默认情况下,MATLAB 存储所有数值变量为双精度浮点值。其他数据类型存储文本,整数或单精度值或单个变量中相关数据的组合。MATLAB不需要任何类型声明或维度语句。当MATLAB遇到新的变量名称时,它将创建变量并分配适当的内存空间。如果变量已经存在,则MATLAB将使用新内容替换原始内容,并在必要时分配新的存储空间。
MATLAB提供15种基本数据类型,分别是8种整型数据、单精度浮点型、双精度浮点型、逻辑型、字符串型、单元数组、结构体类型和函数句柄。每种数据类型存储矩阵或数组形式的数据。矩阵或数组的最小值是0到0,并且是可以到任何大小的矩阵或数组。如表:
数据类型 | 描述 |
---|---|
int8 |
8 位有符号整数 |
uint8 |
8 位无符号整数 |
int16 |
16 位有符号整数 |
uint16 |
16 位无符号整数 |
int32 |
32 位有符号整数 |
uint32 |
32 位无符号整数 |
int64 |
64 位有符号整数 |
uint64 |
64 位无符号整数 |
single |
单精度数值数据 |
double |
双精度数值数据 |
logical |
逻辑值为1 或0 ,分别代表true 和false |
char |
字符数据(字符串作为字符向量存储) |
单元格阵列 | 索引单元阵列,每个都能够存储不同维数和数据类型的数组 |
结构体 | C型结构,每个结构具有能够存储不同维数和数据类型的数组的命名字段 |
函数处理 | 指向一个函数的指针 |
用户类 | 用户定义的类构造的对象 |
Java类 | 从Java类构造的对象 |
示例:创建脚本文件(datatype1.m)
1 |
|
输出结果:
1 |
|
2.1 整数类型
MATLAB 中有 8 种类型的整数,其中包括 4 种有符号整数和 4 种无符号整数:有符号整数能够表示负整数和正整数,而无符号整数类型只能表示正整数和 0。MATLAB 支持 1、2、4 和 8 字节的有符号整数和无符号整数。
八种数据类型的名称、表示方法和类型转换函数。
数据类型 | 取值范围 | 转换函数 |
---|---|---|
有符号8 位整数 |
-27 ~ -27 - 1 | int8() |
有符号 16 位整数 |
-215 ~ -215 - 1 | int16() |
有符号 32 位整数 |
-231 ~ -231 - 1 | int32() |
有符号 64 位整数 |
-263 ~ -263 - 1 | int64() |
无符号 8 位整数 |
0 ~ 28 - 1 | uint8() |
无符号 16 位整数 |
0 ~ 216 - 1 | uint16() |
无符号 32 位整数 |
0 ~ 232 - 1 | uint32() |
无符号 64 位整数 |
0 ~ 264 - 1 | uint64() |
应用时要尽可能用字节数少的数据类型表示数据,这样可以节约存储空间和提高运算速度。
2.1.1 创建整数类型
MATLAB 存储数值数据的默认类型是双精度浮点数,要存储为整数类型的数据,必须使用上表中的转换函数。
- 创建一个有符号的 16 位整数。
1 |
|
- 转换函数将其他数据类型转换为整型。
1 |
|
结果将把 str 字符串里面的每一个字符(包括中间的空格)转换为其 ASCII 码。
输出结果:
1 |
|
- 使用 whos() 函数可显示由一个变量表示的数组的维数、字节计数和数据类型。
1 |
|
- 使用 class() 函数可以知道数据类型并且指定输出
1 |
|
- 使用 isinteger() 函数可以验证变量是否为整数
1 |
|
示例:基于相同整数数据类型之间的数学运算。
1 |
|
多数情况下,整数的除法并不一定得到整数结果。
2.1.2 整数溢出
由于每种整数数据类型都有相应的取值范围,因此数学运算有可能产生结果溢出。MATLAB 利用饱和处理此类问题,即当运算结果超出了由 intmin 和 intmax 指定的上下限时,就将该结果设置为 intmin 或 intmax 的返回值,到底是哪一个,主要看溢出的方向。
示例:
1 |
|
混合数据类型的运算仅限于在一个双精度标量和一个整数数据类型数组之间进行。整数数据类型中不存在双精度数据类型中常见的 inf 和 NaN。除 64 位整数数据类型外,其他整数数据类型都具有比双精度类型更高的存储效率。基于同一整数数据类型的数学运算将产生相同数据类型的结果。
2.2 浮点类型
MATLAB 用双精度或单精度格式表示浮点数,默认格式是双精度,但可以用转换函数转换为单精度。如果某个数据没有被指定数据类型,那么 MATLAB 会用双精度浮点数来存储它。为了得到其他类型的数值类型,可以使用类型转换函数。MATLAB 中的双精度浮点数和单精度浮点数均采用 IEEE 754 中规定的格式来定义。
数据类型名称 | 存储大小 | 表示范围 | 类型转换函数 |
---|---|---|---|
双精度 浮点数 |
4 字节 | -1.79769 × 10308 ~+ 1.79769 ×10308 | double() |
单精度 浮点数 |
8 字节 | -3.40282 × 1038 ~+ 3.40282 × 1038 | single() |
2.2.1 双精度浮点数
MATLAB 按照 IEEE 754 标准构造双精度型数据。作为双精度存储的任何数据,都需要 64 位。
位 | 用途 |
---|---|
63 | 符号,0 = 正,1 = 负 |
62~52 | 指数,偏差值为 1023 |
51~0 | 数 1.f 的小数 f |
2.2.1.1 建立双精度数
因为 MATLAB 默认数值型数据是双精度类型,所以能够用最简单的赋值语句建立双精度数。
示例:
1 |
|
可以用 isfloat() 函数用来验证X是一个双精度的浮点数。
2.2.1.2 转换到双精度数
使用 double() 函数,可以把其他数值型数据、字符、字符串等转换成双精度。
示例:
1 |
|
2.2.1.3 最大和最小的双精度值
MATLAB 的 realmax() 和 realmin() 函数返回能够表示的最大和最小双精度值。
示例:
1 |
|
str 字符串的后半部分\n\t%g to %g用于规定输出格式,称其为格式字串(format string),这与 C语言基本相同。其中 \n 和 \t 是转义字符(Escape Character);转义字符是一种特殊的字符常量,它们以反斜杠\开头,后面跟一个或几个字符。它们具有特定的含义,不同于字符原有的意义,故称“转义”字符。其他转义字符如表。
转义字符 | 说明 |
---|---|
\n | 换行,将当前位置移到下一行开头 |
\t | 水平制表(跳到下一个 TAB 位置) |
\b | 退格,将当前位置移到本行的开头 |
\r | 回车,将当前位置移到本行开头 |
\f | 换页,将当前位置移到本行开头 |
\\ | 代表一个反斜杠字符“\” |
\‘ | 代表一个单引号(撇号)字符 |
\“ | 代表一个双引号字符 |
\ddd | 1 到 3 位八进制数所代表的 ASCII 字符 |
\xhh | 1 到 2 位十六进制数所代表的的 ASCII 字符 |
sprintf() 函数的作用是将规定输出格式的数值写入到字符串的 str 中,成为字符串 str 的一部分。其中 %g 是用于规定输出格式的字符串,称为格式转换字符(Conversion Character),其位置将被后面的 realmin() 和 realmax() 的值所取代。%g 规定输出格式是“紧凑指数形式”。常用的格式转换字符如表。
格式转换字符 | 说明 |
---|---|
%c | 单字符 |
%d | 有符号的十进制数 |
%e | e 指数形式,欧拉数用小写(e) |
%E | e 指数形式,欧拉数用大写(E) |
%f | 定点数形式 |
%g | %e 或 %f 的紧凑格式,不显示多余的零 |
%G | 与 %g 相同,但用大写 E |
%o | 八进制(octal)数形式 |
%s | 字符串 |
%u | 十进制(decimal)数形式 |
%x | 十六进制数形式,用小写字母 a~f |
%X | 十六进制数形式,用大写字母 A~F |
2.2.2 单精度浮点数
MATLAB 按照 IEEE 754 标准构造单精度型数据。作为单精度存储的任何数据,都需要 32 位。
位 | 用途 |
---|---|
31 | 符号,0 = 正,1 = 负 |
30 ~ 23 | 指数,偏差值为 127 |
22 ~ 0 | 数 1.f 的小数 f |
单精度值依然使用 realmax() 和 realmin() 函数返回单精度能够表示的最大值和最小值,只是调用时要有参数single。
- 建立单精度数必须使用 single() 函数建立单精度数。
1 |
|
同样,用 single 函数能将其他数字、字符、字串和逻辑等类型的数转换成单精度数。
示例:
1 |
|
单精度数据之间或单精度与双精度数据之间的数学运算结果将为单精度数。(接上面代码)
1 |
|
- 单精度数据类型中包含双精度数据类型中常见的特殊浮点值 inf 和 NaN。
示例:
1 |
|
2.3 NAN
NaN 是 Not a Number 的缩写,意思是“不是一个有效的数字”。MATLAB NaN 表示一个没有意义的数字,这种数字在数学上是无法定义的。NaN 一般是在没有意义的数学计算中得到的,比如 0/0,Inf/Inf,Inf-Inf,Inf*0。在处理不完整的数据时,这些数据也会被当做 NaN,比如在读取数字时,遇到的字符不是数字,就会被当做 NaN。
对 NaN 进行运算的结果仍然是 NaN。
示例:
1 |
|
第一条语句生成了一个含有 NaN 的向量 a,第二和第三条语句分别对 a 进行乘法和开方运算,从运算结果可以看到,对 NaN 进行数学运算的结果仍然是 NaN。第四条和第五条语句的结果或许有些出乎意料:a==nan 得到的结果全部都是 0(false),而 a~=nan 却得到了全部是 1(true)的结果。这一结果表明,在 MATLAB 中,不同的 NaN 之间是不相等的。鉴于 NaN 的这种特性,我们在进行关系运算时,就必须确定数组中是否含有 NaN。
2.3.1 isnan() 函数
MATLAB 为我们提供了一个内置函数 isnan(),专门用来寻找数组中是否含有 NaN。
示例:利用 isnan() 函数寻找 a 中的 NaN。
1 |
|
isnan() 函数在数组中 NaN 的位置返回 1(true)。
将 isnan() 和 find() 函数联合使用可以寻找数组中 NaN 的位置索引。
示例:找到数组 a 中 NaN 的位置,然后在这些位置上用 0 替代 NaN。
1 |
|
2.4 空数组
MATLAB 空数组是开发人员定义的一个数据类型(这一点与 MATLAB NaN 不同,因为 NaN 是由 IEEE 标准定义的),它指有一维或多维的长度为 0 的数组变量。空数组的表达方式也很多,最简单的一种是直接用两个方括号表示的数组,即 [ ] 数组。
示例:几种空数组的创建方式,并用 size 或 length 查看了它们的维数或长度。
1 |
|
使一个数组的维数为 0 也许会感到困惑,但这在许多运算中是非常有用的。空数组有时也出现在一些函数的返回参数中。在 MATLAB 中,很多函数在无法返回适当结果时,往往会返回空数组。
示例:使用 find() 函数 。
1 |
|
数组 x 中不存在大于 2 的值,因此找不到正确的索引值,于是 find 就返回一个空数组。
- 使用 isempty() 函数测试一个返回值是否是空数组。
1 |
|
由于空数组也存在维数(如前面创建的 c 为 0×5 的数组),在 MATLAB 中,不同维数的空数组之间是不能进行比较的,因此,验证一个数组是否是空数组时,最好不要使用关系运算,建议使用 isempty() 函数。
示例:验证前面创建的 c 是否是空数组,只能采用 isempty() 函数。
1 |
|
当用户确认空数组是最简单的空数组 [ ] 时,关系运算也成立,只不过运算结果仍是空数组。
1 |
|
将一个非空数组与一个空数组进行比较,结果返回一个空数组。
示例:
1 |
|
对空数组执行关系运算时,要么返回一个错误信息(如在两个不同维数的空数组之间进行比较时),要么返回一个空数组(如前面的两个例子),这通常都不是我们想要的结果,因此,当有空数组出现时,建议用户使用 isempty() 函数,尽量不要使用关系运算。
2.5 复数类型
复数是指既包含实部又包含虚部的数,虚部的单位是 -1 的开平方根,在 MATLAB 中用字母 i 或 j 中的一个表示,i 和 j 的作用是完全一样的。即:
1 |
|
复数的一般形式:C = a + bi(其中 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)
2.5.1 创建复数
在 MATLAB 中创建复数有两种方法:直接生成或者使用 complex() 函数生成。
2.5.1.1 直接生成法
1 |
|
所谓直接生成,也就是将复数直接写出来。
2.5.1.2 使用 complex() 函数生成
1 |
|
其中 x、y 为实数,得到的 z 是以 x 为实部,y 为虚部的复数。
也可以这样使用 complex() 函数:
1 |
|
其中 x 为实数,得到的 z 是以 x 为实部,以 0 为虚部的复数。
示例:
1 |
|
应用 rand(3) 函数生成 3×3 的随机数矩阵。通过 real() 和 imag() 函数可以把复数分为实数和虚数部分。
常见的支持复数运算的 MATLAB 函数。如表。
函数名 | 描述 |
---|---|
conj(c) |
计算 c 的共轭复数,如果 c=a+bi,那么 conj(c)=a-bi |
real(c) |
返回复数 c 的实部 |
imag(c) |
返回复数 c 的虚部 |
isreal(c) |
如果数组 c 中没有一个元素有虚部,函数 isreal(c) 将返回 1;所以如果一个数组 c 是 复数组成,那么 isreal(c) 将返回 0 |
abs(c) |
返回复数 c 的模 |
angle(c) |
返回复数 c 的幅角 |
2.5.2 数据类型函数
函数名 | 描述 |
---|---|
double |
创建或转化为双精度数据类型 |
single |
创建或转化为单精度数据类型 |
int8 ,int16 ,int32 ,int64 |
创建或转化为有符号整数数据类型 |
uint8 ,uint16 ,uint32 ,uint64 |
创建或转化为无符号整数数据类型 |
isnumeric |
若是整数或浮点数据类型,返回 true |
isinteger |
若是整数数据类型,返回 true |
isfloat |
若是单精度或双精度数据类型,返回 true |
isa(x,'type') |
type 包括 numeric、integer 和 float,当 x 类型为 type 时,返回 true |
case(x,'type') |
将 x 类型置为 type |
intmax('type') |
type 数据类型的最大整数值 |
intmin('type') |
type 数据类型的最小整数值 |
realmax('type') |
type 数据类型的最大浮点实数值 |
realmin('type') |
type 数据类型的最小浮点实数值 |
eps('type') |
type 数据类型的 eps 值(浮点值) |
eps(x) |
x 的 eps 值,即 x 与 MATLAB 能表示的和其相邻的同数据类型的那个数之间的距离 |
zeros(...,'type') |
创建数据类型为 type 的全 0 阵列 |
ones(...,'type') |
创建数据类型为 type 的全 1 阵列 |
eye(...,'type') |
创建数据类型为 type 的单位阵列 |
2.6 标点符号
MATLAB 中分号、冒号、逗号等常用标点符号的作用如表。
名称 | 符号 | 功能 |
---|---|---|
空格 | 用于输入变量之间的分隔符以及数组行元素之间的分隔符 | |
逗号 | , |
用于要显示计算结果的命令之间的分隔符;用于输入变量之间的分隔符;用于数组行元素之间的分隔符 |
点号 | . |
用于数值中的小数点 |
分号 | ; |
用于不显示命令行的结尾;用于不显示结果直接的分隔符;用户数组行元素之间的分隔 |
冒号 | : |
用于生成一维数值数组,表示一维数值的全部元素或多维数组某一维的全部元素 |
百分号 | % |
用于注释的前面,在它后面的命令不需要执行 |
单引号 | ' |
用于括住字符串 |
圆括号 | () |
用于引用数组元素;用于函数输入变量列表;用于确定算术运算的先后次序 |
方括号 | [] |
用于构成向量和矩阵;用于函数输出列表 |
花括号 | {} |
用于构成元胞数组 |
下划线 | _ |
用于一个变量、函数或文件名的连字符 |
续行号 | ... |
用于把后面的行与该行连接以构成一个较长的命令 |
“@”号 | @ |
用于放在函数名前形成函数句柄;用于放在目录名前形成用户对象类目录 |
2.6.1 冒号(:)的常用方法
- a:b表示 [a,a+1,…,b]。
1 |
|
- 如果 b 和 a 不是整数,则向量的最后一位数是 n+a,且 n=fix(b-a)。(a<b)
1 |
|
- 上面的前提是 a<b,如果 a>b 则会出现空值。
1 |
|
此时, A 是空矩阵,从工作区也可以看到 A。
- a : b : c表示 [a,a+c,…,a+n*c],其中 n=fix((b-a)/c)。
1 |
|
- A(:)表示以一列的方式显示 A 中的所有元素。
1 |
|
- b=A(i,:)表示把矩阵 A 的第 i 行存入 b。
1 |
|
- b=A(:,j)表示把矩阵 A 的第 j 列存入 b。
1 |
|
- b=A(J:K)表示把矩阵 A 中 [A(J), A(J+1),…,A(K)] 这些元素存入 b 中。
1 |
|
- b=A(:,c.d)表示把矩阵 A 的第 c 列到第 d 列存入 b 中,当然 c、d 大于 A 的列数则出错(b=A(c:d,:) 表示取行)。
1 |
|
2.7 数据类型转换
将一种数据类型转换为另一种数据类型的函数。
函数 | 描述说明 |
---|---|
char |
转换为字符数组(字符串) |
int2str |
将整数数据转换为字符串 |
mat2str |
将矩阵转换为字符串 |
num2str |
将数字转换为字符串 |
str2double |
将字符串转换为双精度值 |
str2num |
将字符串转换为数字 |
native2unicode |
将数字字节转换为Unicode字符 |
unicode2native |
将Unicode字符转换为数字字节 |
base2dec |
将基数N字符串转换为十进制数 |
bin2dec |
将二进制数字串转换为十进制数 |
dec2base |
将十进制转换为字符串中的N数字 |
dec2bin |
将十进制转换为字符串中的二进制数 |
dec2hex |
将十进制转换为十六进制数字 |
hex2dec |
将十六进制数字字符串转换为十进制数 |
hex2num |
将十六进制数字字符串转换为双精度数字 |
num2hex |
将单数转换为IEEE十六进制字符串 |
cell2mat |
将单元格数组转换为数组 |
cell2struct |
将单元格数组转换为结构数组 |
cellstr |
从字符数组创建字符串数组 |
mat2cell |
将数组转换为具有潜在不同大小的单元格的单元阵列 |
num2cell |
将数组转换为具有一致大小的单元格的单元阵列 |
struct2cell |
将结构转换为单元格数组 |
2.8 数据类型确定
用于识别变量数据类型的各种函数。
函数 | 描述说明 |
---|---|
is |
检测状态 |
isa |
确定输入是否是指定类的对象 |
iscell |
确定输入是单元格数组 |
iscellstr |
确定输入是字符串的单元格数组 |
ischar |
确定项目是否是字符数组 |
isfield |
确定输入是否是结构数组字段 |
isfloat |
确定输入是否为浮点数组 |
ishghandle |
确定是否用于处理图形对象句柄 |
isinteger |
确定输入是否为整数数组 |
isjava |
确定输入是否为Java对象 |
islogical |
确定输入是否为逻辑数组 |
isnumeric |
确定输入是否是数字数组 |
isobject |
确定输入是否为MATLAB对象 |
isreal |
检查输入是否为实数数组 |
isscalar |
确定输入是否为标量 |
isstr |
确定输入是否是字符数组 |
isstruct |
确定输入是否是结构数组 |
isvector |
确定输入是否为向量 |
class |
确定对象的类 |
validateattributes |
检查数组的有效性 |
whos |
在工作区中列出变量,其大小和类型 |
示例:创建脚本文件
1 |
|
输出结果:
1 |
|
3.函数
3.1 函数基本结构
1 |
|
当有多个形参时,形参之间用逗号分隔,组成形参表。当输出形参多余一个时,应该用方括号括起来,构成一个输出矩阵。
函数文件名:通常由函数名再加上扩展名 .m 组成,函数文件名与函数名也可以不相同。但一般情况这两个名字都相同。
return 语句表示结束函数的执行。
示例:
1 |
|
3.2 函数调用
1 |
|
示例:
1 |
|
3.3 匿名函数
1 |
|
示例:
1 |
|
类似于带参宏定义!
- 给已经存在的函数定义函数句柄
1 |
|
示例:
1 |
|
本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/3768803371.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!