目录
MATLAB 零基础学习
简介
MATLAB(Matrix Laboratory)是Mathworks 公司(成立于1984 年,位于马萨诸塞州纳蒂克)
开发的一个软件包。MATLAB 支持高性能数值计算和可视化功能,有80 多个工具箱,可用
于各种计算、图形任务。
https://ww2.mathworks.cn/products/matlab.html
使用平台
本人使用的MATLAB 版本是R2021a
一、MATLAB 界面
启动MATLAB 之后可以看到MATLAB 窗口有以下子窗口:最上面是工具栏和功能区。
- 命令行窗口(Command window):这是MATLAB 主窗口(有命令>>),从中启动应用程
序或键入命令。 - 当前文件夹(Current directory):当前文件的位置,文件的默认路径,文件运行时需要
定位到文件所在目录。输入cd 查看命令,可以查看当前路径,使用cd 命令更改到合适的目
录,执行MATLAB 文件。 - 工作区(Workspace):工作区显示了所有变量的类型和大小,可以单击一个变量进行查
看。 - 编辑器(The Editor window):可以在编辑器这里编辑、创建、保存MATLAB 程序,单击
新建脚本,出现编辑器窗口,点击新建、运行、保存,对文件进行操作。
二、基础操作
使用方法
可以像使用计算器一样使用MATLAB 进行简单加、减、乘、除、指数运算等运算。有两
种使用方法:
(1)直接将运算输入命令行,按回车键得到计算结果。
(2)输入数学表达式进行计算,将结果存储在变量中。
在命令行输入命令之后按回车执行。
其中,r,d 为变量的名称,d=2*r 是赋值语句,首先计算等号右边的值,将值赋值给等号左边的变量。
常用数学函数
以下列举出常用的数学函数,包括三角函数、指数函数、对数函数、复数函数、取整、取余等。
初等函数
+ | 添加数字 |
---|---|
sum | 数组元素求和 |
cumsum | 累计和 |
movsum | 移动总和 |
- | 减法 |
---|---|
diff | 差分和近似导数 |
.* | 乘法 |
---|---|
* | 矩阵乘法 |
prod | 数组元素的乘积 |
cumprod | 累积乘积 |
pagemtimes | 按页矩阵乘法 |
./ | 数组右除 |
---|---|
.\ | 数组左除 |
/ | 求解关于x的线性方程组 xA =B |
\ | 求解关于x的线性方程组 Ax =B |
.^ | 按元素求幂 |
---|---|
^ | 矩阵幂 |
mod | 除后的余数(取模运算) |
rem | 除后的余数 |
idivide | 带有舍入选项的整除 |
ceil | 向正无穷舍入 |
fix | 向零舍入 |
floor | 向负无穷舍入 |
round | 四舍五入为最近的小数和整数 |
三角函数
sin | 参数的正弦,以弧度为单位 |
---|---|
sind | 参数的正弦,以度为单位 |
sinpi | 准确地计算sin(X*pi) |
asin | 反正弦(以弧度为单位) |
asind | 反正弦(以度为单位) |
sinh | 双曲正弦 |
asinh | 反双曲正弦 |
cos | 以弧度为单位的参数的余弦 |
---|---|
cosd | 以度为单位的参数的余弦 |
cospi | 准确地计算cos(X*pi) |
acos | 反余弦(以弧度为单位) |
acosd | 反余弦(以度度为单位) |
cosh | 双曲余弦 |
acosh | 反双曲余弦 |
tan | 以弧度为单位的参数的正切 |
---|---|
tand | 以度为单位的参数的正切 |
atan | 反正切(以弧度为单位) |
atand | 反正切(以度为单位) |
atan2 | 四象限反正切 |
atan2d | 四象限反正切(以度为单位) |
tanh | 双曲正切 |
atanh | 反双曲正切 |
指数和对数
exp | ex |
---|---|
expm1 | 针对较小的X值正确计算exp(x)-1 |
log | 自然对数ln |
log10 | 常用对数以10为底 |
log1p | 针对较小的X值正确计算log(1+x) |
log2 | 以2为底的对数和浮点数分解 |
nextpow2 | 2的更高次幂的指数 |
nthroot | 实数的第n次实根 |
pow2 | 浮点数的以2为底的幂运算和缩放 |
reallog | 非负数-实数-数组的自然对数 |
realpow | 仅实数输出的数组幂 |
realsqrt | 非负-实数-数组的平方根 |
sqrt | 平方根 |
复数
abs | 绝对值的和复数的模 |
---|---|
angle | 相位角 |
complex | 创建复数数组 |
conj | 复共轭 |
cplxpair | 将复数排序为复共轭对组 |
i | 虚数单位 |
imag | 复数的虚部 |
isreal | 确定数组是否使用复数存储 |
j | 虚数单位 |
real | 复数的实部 |
标点符号
(1)分号(;)
在一条语句结尾处作为结束,或者用于数组分行。
(2)百分号(%)
在程序文本中添加注释,百分号之后的文本为注释,不进行编译。
常用操作
以下列举一些常用的命令和快捷键,可以操作更加方便。
ans | 最近计算的答案 |
---|---|
clc | 清空命令行窗口 |
diary | 将命令行窗口文本记录到日志文本中 |
format | 设置命令行窗口的输出显示格式 |
home | 发送光标复位 |
iskeyword | 确定输入是否为Matlab关键字 |
more | 控制命令行窗口的分页输出 |
clear | 清空工作区的变量 |
cd | 显示或者更改工作目录 |
dir | 显示当前目录下的文件 |
Esc | 取消当前输入行 |
↑ | 调用上一行 |
↓ | 调用下一行 |
Ctrl+k | 剪切光标和表达式结尾之间的内容 |
Ctrl+N | 新建脚本 |
三、文件类型
MATLAB 的文件,文件是命令数据的集合。
-
m 文件,扩展为.m
用MATLAB 编写的程序文件为M 文件,可以读取、修改、执行。根据调用方式的不同,分为脚本文件(script)和函数文件(function)。脚本文件是代码的集合,将一系列命令输入到脚本文件中,执行文件,会依次执行命令。函数文件时以function 为开头,定义一个函数,可以被调用。 -
mat 文件,扩展为.mat
MATLAB 中使用的数据存储文件,保存时创建,使用load 命令进行读取。 -
figure 文件,扩展为.fig
MATLAB 的图形,保存时创建。
数组
一、数组基础知识
- 数组简介
数组是一个相同数据类型元素的集合(通常存储在连续的内存位置),单个数据元素通
过一个或多个索引(在两个或多个维度的情况下)进行访问。 - 数组分类
根据数组元素个数排列方式分类,数组可分为:空数组,向量(一维数组),二维数组,多维数组。
空数组是没有元素的数组。
向量是只有一行或者一列的数组,也称为一维数组。只有一个元素的变量也认为是一维数组。一维数组x=[1 2 3 4 ]有四个元素。
二维数组具有多行多列。二维数组是矩阵。二维数组y=[1 2 3; 4 5 6]有两行三列。
多维数组是维数超过2 的数组,具有多个维度。 - 数组维数计算
通过size()函数可以得到数组每一维的大小,返回n 维向量,包含每一维的大小。
length()函数返回数组的最大维度。
二、数组创建与操作
创建数组可以通过直接输入来创建,也可以通过MATLAB 内置函数来创建。
创建
(1) 直接创建
>>x=[1 2 3]
x=
1 2 3
>>y=[1;2;3]
y=
1
2
3
(2) 内置函数创建
函数zeros(m,n)可以创建全为0 的m 行n 列的数组。
函数ones(m,n)可以创建全为1 的m 行n 列的数组。
函数diag(A)可以创建对角元素为A 的对角矩阵。
函数 eye()可以创建单位矩阵。
函数 rand(m,n)可以创建 m 行 n 列的取值为 0-1 的随机数组。
函数 linspace(x1,x2,n)可以创建在 x1 和 x2 之间的等距数组。
数组操作
(1) 获取数组中的元素
根据索引值获取元素,利用圆括号括起来索引值。如:A(2,3)得到数组A 中第二行第三列的元素。
根据冒号和表达式获取元素,如:A(i,:)得到第i 行的所有元素,A(i,:)得到第i 行的所有元素,A(:,j)得到第j 列的所有元素。A(i,k:k+m)得到第i 行第k 列到k+m 列的所有元素,A(k:k+m,j)得到第k 行到k+m 行第j 列的所有元素。
(2) 数组算数操作
两个数组的维数相同或者其中一个为标量可以进行加减乘除指数算数操作。两个数组的乘法、除法、指数运算需要用’.’点操作符,如:.*, ./, .^。
(3)使用库函数运算
sum 函数运用于二维数组时,计算数组每一列元素的和,返回一个行向量。运用于一维数组时,返回数组所有元素的和。
mean 函数运用于二维数组时,计算数组每一列元素的平均值,返回一个行向量。运用于一维数组时,返回数组所有元素的平均值。
min 函数运用于二维数组时,返回数组每一列元素的最小值,返回每一列最小值所在行号的行向量。运用于一维数组时,返回数组的最小值和位置。
max 函数运用于二维数组时,返回数组每一列元素的最大值,返回每一列最大值所在行号的行向量。运用于一维数组时,返回数组的最大值和位置。
(4) 数组逻辑运算
对数组进行逻辑运算得到布尔值,返回逻辑值数组与原数组具有相同大小。
与”&”对数组进行与逻辑运算,或”|”对数组进行或逻辑运算,非”~”对数组进行非逻辑运算,如下。
(5) 数组连接
如果两个数组具有相同的行数,两个数组可以水平方向连接。[A,B]
如果两个数组具有相同的列数,两个数组可以垂直方向连接。[A;B]
字符串数组
这里先简单介绍字符串数组,字符串可以由单引号创建。字符串其实是元素为ASCII 码的字符数组,可以按照数组的操作对字符串的元素进行操作。
字符串可以有多行,但每一行需要有相同字符数。字符串连接,和数组连接操作相同。
如果两个数组具有相同的行数,两个数组可以水平方向连接。如果两个数组具有相同的列数,
两个数组可以垂直方向连接。
字符串、元胞数组和结构体
一、字符串操作和运算
字符串操作和运算
字符串相当于一个数组,每一个字符相当于数组中的一个元素,可以像操作数组一样对
字符串元素的操作。
字符串运算包括判断字符串是否相等,对字符进行比较,查找,替换等。
常用的字符串运算函数如下表。
函数名 | 作用 |
---|---|
strcat | 连接字符串 |
strcmp | 字符串比较 |
findstr | 字符串查找 |
strncmp | 比较字符串前n 个字符 |
eval | 将字符串作为命令执行 |
str2num, str2double 函数可以将字符串转换为数值。
num2str 函数将数值数组转换为表示数字的字符数组。
二、元胞数组
元胞数组是可以包含各种类型和大小的数据的数组。
创建
用{}运算符或cell 函数创建元胞数组。将元素用{}括起来,直接创建元胞数组,也可以利用cell 函数创建空元胞数组,再为数组元素逐个赋值。
操作
访问
访问元胞数组的内容,索引用花括号括起来。
用花括号进行访问,得到的是该单元的内容。
而用圆括号对元胞数组进行访问,表示的是该单元。
删除
将元胞数组元素删除,根据索引得到该元素,直接将该元素设置为空[]。
索引用圆括号括起来是该单元,索引用花括号括起来是该元素。
访问使用celldisp©显示元胞数组内容。
三结构体
三、结构体
结构体是带有可以包含各种类型和大小的数据的命名字段的数组。
结构体也可以将不同类型数据组合在一起,结构体与元胞数组的区别在于,结构体有名字,每个成员元素也有名字,通过元素的名字来访问元素。
创建
结构体可以通过直接输入结构体各元素的值创建,也可以通过struct 函数创建。
直接输入创建结构体,定义该结构体的名称,并使用圆点“.”将变量与结构体名连接。
定义一个名称为patient 的结构体变量,patient.name 为结构体第一个成员,patient.billing为结构体第二个成员,patient.test 为结构体第三个成员。
使用struct 函数定义结构体,s=struct(‘field1’,Value1,…,‘fieldN’,ValueN)同时定义多个字段,
field 为各成员名称,Value 为各成员变量的内容。Value 可以是任何类型的数组。
操作
(1)查看结构体的字段名称
使用fieldnames 函数结构体的字段名称。names = fieldnames(s);
(2)访问和更改成员变量
使用圆点访问和更改成员的值,即“结构体.成员名”的方式。
(3)添加成员变量
使用圆点加变量名称并赋值。
(4)删除成员变量使用rmfield 从结构体中删除成员变量。S=rmfield(S,’field’);
MATLAB 编程
编程为创建和编写脚本文件。
对于复杂问题需要使用脚本文件,将一组MATLAB 命令保存在脚本文件,文件名以.m为扩展名,运行脚本文件执行程序。
脚本文件是最简单的代码文件类型,脚本文件没有输出和输入。
创建和使用脚本文件
创建脚本文件可以点击主页选项卡上的新建脚本按钮或者使用edit 函数。
edit 函数会创建并打开一个文件,edit new_file_name 会创建(如果不存在相应文件)
并打开一个名为new_file_name 的文件。如果没有指定名称,将打开一个Untitled 的新文件。
创建和编辑脚本文件之后,保存生成.m 文件,运行脚本可以通过命令行键入脚本名称
并按回车键进行执行,或者在编辑器选项卡上点运行按钮。
脚本执行后,变量会保存在工作区。
脚本文件命名规则,必须以字母开头,可以包含数字和下划线字符,最多可以有31 个字符。脚本文件的名称不要与变量的名称相同,否则无法执行脚本文件。
可以使用exist 检查函数或者文件名是否存在。如果存在则返回1,不存在则返回0。
调试脚本文件
MATLAB 是一种解释与执行同时进行的语言,代码的调试比较方便。程序调试就是找到程序中的错误并去除。错误大致分为语法错误,运行错误和异常。
MATLAB 通常能检查出语法错误,例如遗漏括号,遗漏引号,命令名错误等。
运行错误是流程出错或者程序有误造成的执行结果错误。异常是程序执行时不满足执行条件而造成的错误。
MATLAB 可以通过设置断点查看工作区的值来调试。
调试流程
运行程序时,命令窗口提示错误。根据错误提示,分析程序出现错误的原因,调试过程
中,在可能出现错误的位置设置断点。如果没有报错但计算结果有误,则分析哪一步计算出
现问题,在可能出现错误的位置设置断点。
MATLAB 中编辑器功能区有设置断点(breakpoint)的选项,暂停代码执行选项,可用
来设置或清除断点。设置断点时,在行的左侧点击出现红色圆点,再次点击红色圆点处可以
去除断点。当程序执行时,运行到断点停止,可以查看中间步骤的变量。
在指定行设置断点,程序执行时在断点指定行停止执行。在恢复执行前,可以查看或修改函数工作空间中变量的值。将鼠标点在需要停止的文本行的左边,显示红色圆点代表这一行设置了断点。
点击工具栏编辑器中的运行按钮或者按F5 键运行程序,当程序运行到断点之处,程序暂停运行,等待下一步操作。断点右侧显示绿色箭头,绿色箭头指示要执行的下一个命令行。
程序调试运行时,命令行的提示符变为“K>>”,可以在命令行中输入命令,不会打断程序的执行。此时可以输入一些命令,查看中间变量。
单击编辑器中的继续按钮或者按F5 键,从断点处继续运行。按步进按钮或者按F10 键可以进行单步调试,程序一步一步向下执行。
将鼠标停留在某个变量上,会显示变量的当前值。也可以通过查看工作空间的各个变量的值和属性,查看变量的值,检查计算的值是否正确。
根据以上分析,发现错误,纠正错误,修改程序,清除所有断点,保存文件。
输入输出命令
MATLAB 可以从用户获取输入,控制格式化输出。输入和输出的命令包含如下。
disp(A) | 显示A的内容 |
---|---|
disp(‘text’) | 显示单引号内部的文本串 |
format | 控制屏幕输出的显示格式 |
fprintf | 格式化写入屏幕或者文件中 |
x=input(‘text’) | 显示单引号内的文本,等待用户从 键盘输入,将输入存储在x 中 |
函数
1.声明函数
function [y1,…,yN] = myfun(x1,…,xM)
function [y1,…,yN] = myfun(x1,…,xM) 声明名为myfun 的函数, 该函数接受输入
x1,…,xM 并返回输出y1,…,yN。将函数代码保存在扩展名为.m 的文本文件中。文件的名称应与文件中其函数的名称一致。函数名称以字母字符开头,并且可以包含字母、数字或下划线。使用end 关键字来表示每个函数在文件中的结尾
2函数输入输出参数
nargin 针对当前正在执行的函数,返回传递给该函数调用的输入参数的数目。该nargin
语法仅可在函数体内使用。
nargin(fx) 返回函数定义语句fx 中出现的输入参数的数目。
nargout 针对当前正在执行的函数,返回该函数调用中指定的输出参数的数目。该
nargout 语法仅可在函数体内使用。
nargout(fx) 返回fx 函数定义语句中出现的输出参数的数目。
3.函数类型
程序文件中可以包含多个函数,局部函数可用于将程序分解为更小的任务。文件中的其他函数称为局部函数。局部函数仅对同一文件中的其他函数可见。局部函数也被称为子函数。
例如:一个名称为mystats.m 的程序文件,其中包括主函数mystats 以及两个局部函数mymean 和mymedian。
匿名函数不存储在程序文件中,允许定义该函数而不必创建程序文件,匿名函数可以接
受输入并返回输出,就像标准函数一样。但是,可能只包含一个可执行语句。
匿名函数通常用于定义数学表达式,使用功能函数(即接受函数句柄作为输入的函数),
将函数句柄用作输入,在特定值范围计算该表达式。
例如,创建用于计算平方数的匿名函数的句柄:
sqr = @(x) x.^2;
a = sqr(5);
变量sqr 是一个函数句柄。@ 运算符创建句柄,@ 运算符后面的圆括号() 包括函数的输入参数。该匿名函数接受单个输入x,并显式返回单个输出,即大小与包含平方值的x相同的数组。通过将特定值(5) 传递到函数句柄来计算该值的平方。
[y1,…,yN] = feval(fun,x1,…,xM)
使用函数的名称或其句柄以及输入参数x1,…,xM 来计算函数的结果。
a = feval(sqr, 5); 和a = sqr(5); 计算函数句柄sqr,输入为5 的值。
关系运算符和逻辑变量
一、逻辑关系符
1.关系运算
符号 | 等效函数 | 说明 |
---|---|---|
< | lt | 小于 |
<= | le | 小于或等于 |
> | gt | 大于 |
>= | ge | 大于或等于 |
== | eq | 等于 |
~= | ne | 不等于 |
当用于比较数组时,比较的数组具有相同的维数,关系运算符逐元素比较数组,得到数组元素为比较结果为1 或0。在MATLAB 中标量也是一个数组,数组和标量可以进行比较,
比较时,数组中的每个元素都和标量进行比较。
2.logical 类和logical 函数
logical 是一种逻辑数据类型,逻辑变量的值为1(真)或者0(假)。
使用logical 函数可以将数组转化为逻辑数组,使用double 函数也可以将逻辑数组转换为double 类型的数组。
使用逻辑数组寻址另一个数组时,可以从数组中提取到逻辑值为1 位置的元素。使用逻辑数组用于寻址计算,例如:x(x<y)能够找到x 中所有逐个小于y 的元素,将找到的元素存储在b 中。
二、逻辑运算
1.逻辑运算符
MATLAB 有多个逻辑运算符,也称为布尔(boolean)运算符,逻辑运算也称为布尔运算。
逻辑运算符的优先级比算数运算符和逻辑运算符低,NOT 运算符除外。
Short-circuit &&,|| | 具有短路功能的逻辑运算 |
---|---|
& | 计算逻辑 AND |
~ | 计算逻辑 NOT |
| | 计算逻辑 OR |
NOT 运算~A 返回与A 大小相同的逻辑数组。如果A 中元素为零值,则数组中对应元素为逻辑值1 (true) 值;如果A 中元素为非零值,则数组中对应元素为逻辑值0 (false)。
A & B 对数组A 和B 执行逻辑AND 操作,并返回包含设置为逻辑值1 (true) 或逻辑值0 (false) 的元素的数组。
如果A 和B 在相同的数组位置都包含非零元素,则输出数组中对应位置的元素将设置为逻辑值1 (true)。如果不是,则将数组元素设置为0。
A | B 对数组A 和B 执行逻辑OR 操作,并返回包含设置为逻辑值1 (true) 或逻辑值0
(false) 的元素的数组。如果A 或B 中相同位置元素存在非零元素,则输出数组中对应元素为逻辑值1 (true)。如果不是,则将数组元素设置为0。
短路逻辑运算符是当有多个表达式时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值,只有结果不能由第一个表达式确定的时候,才计算第二个表达式的值。
expr1 && expr2 表示使用短路行为的逻辑AND 运算,如果两个表达式的值都为true,返回逻辑1(true),如果有一个为false,返回逻辑值0(false)。
即,如果expr1 为逻辑值0 (false),
将不计算expr2 的结果。每个表达式的计算结果都必须为标量逻辑值。
expr1 || expr2 表示使用短路行为的逻辑OR 运算,如果有一个值为true,返回逻辑值1(true),如果两个值都为false,则返回逻辑值0(false)。
即,如果expr1 为逻辑值1 (true),将不计算expr2 的结果。每个表达式的计算结果都必须为标量逻辑值。
2.逻辑函数
常用的逻辑函数如下。
xor | 计算逻辑异OR |
---|---|
all | 确定所有的数组元素是为非零还是True |
any | 确定是否有任何数组元素非零 |
find | 查找非零元素的索引和值 |
true | 逻辑值1(真) |
false | 逻辑0(假) |
logical | 将数值转换为 逻辑 值 |
islogical | 确定输入是否为 逻辑 数组 |
isinteger | 确定输入是否为 整数 数组 |
isfloat | 确定输入是否为 浮点 数组 |
isnumeric | 确定输入是否为 数值 数组 |
ischar | 确定输入是否为 字符 数组 |
isfinite | 确定哪些数组元素为 有限 值 |
isinf | 确定哪些数组元素为 无限 值 |
isrel | 确定数组是否使用 复数 存储 |
isnan | 确定哪些数组元素为 NaN |