MATLAB 是 MATrix LABoratory 的缩写,它将计算、可视化和编程功能集成在非常便于使用的环境中,是一个交互式的以矩阵计算为基础的科学和工程计算软件。其特点如下:
- 编程效率高 用它编程犹如在纸上书写公式,编程时间和程序量大大减少。
- 计算功能强 其数据对象为不必指定维数的矩阵和数组,矩阵和向量计算功能特别强。
- 使用简便 其语言灵活方便,将编译、连接、执行融为一体。
- 易于扩充 用户根据需要建立的文件可以和库函数一样被调用,提高了效率、扩充了计算功能
此外 Matlab 还有很方便的绘图功能。
简单的数学运算
1 | >> 4+6+2 % 键入回车, 下同 |
注:
- 未指明建立变量时名为
ans
的变量自动建立 (作为结果的默认变量名) - 在大多情况下 Matlab 不会理会空格的存在。
1 | >> a=4; |
在 Matlab 中基本的数学运算符号: +
-
*
右除/
左除\
^
在 Matlab 中不管多少层括号,统一用小括号 ()
复数:Matlab 在处理复数时 i
或 j
均表示虚数单位
1 | >> c1=1-2i |
一个“=”表赋值 两个“==”表“等于”关系
为了核对某个变量的值只需要在提示符后输入这个变量名。可以用 who
或 whos
来查看内存中 (工作区中) 现有的变量名列表。为了重新输入原来输入过的命令可以用键盘的上、下键。
矩阵 数组 函数
矩阵的输入和运算
输入方法:
- 直接输入每个元素,用逗号或空格及分号隔开
- 由语句或函数生成
- 在 m- 文件中生成
矩阵的直接输入举例
1 | >> A=[1 2 3;4 5 6] % [表矩阵输入的开始,]表矩阵输入的结束 |
元素的引用
1 | >> a=A(2,1) % 表示A的第二行第一列的元素 |
注:若不指定变量名 Matlab 自动生成一个 ans
变量(answer)
1 | >> A(3,4)=1 |
原来 A 没有 3 行 4 列,Matlab 自动增加行、列,对未指明的元素赋初值为 0.
函数生成矩阵
1 | >> w=zeros(2,3) % (2×3元素全为0矩阵) |
矩阵的裁剪与拼接
从一个矩阵取出若干行 (列) 构成新矩阵称为裁剪。:
是一个非常重要的裁剪工具
1 | >> A(3,:) % A的第三行, “:”表示“所有” |
(2:2:4 表从第 2 到第 4,步长 2 (步长也可以为负))
1 | >> A(1:2:3,4:-1:2) % A的第1、3行, 第4、3、2列 |
若无等矩规律,最一般的状况:设 $A$ 为一四阶方阵选取任意子矩阵:A([1,2,4],[1,3,4])
选取的行数构成一行向量,选取的列数构成一行向量二者用逗号分隔。
将几个矩阵拼接在一起时只需要注意:左右拼接时行数要相同,上下拼接时列数要相同。
矩阵的运算
+
-
/
*
^
\
, \
为左除, /
为右除,说明如下:
设定 $A$ 为可逆矩阵,$Ax=b$ 的解是 $A$ 左除 $b$,即 x=A\b
;
$xA=c$ 的解 $x$ 是 $A$ 右除 $c$ 即 x=c/A
.
特别注意:.*
与 *
的区别 .*
为对应位置元素运算,*
为矩阵意义的运算.
.^
与 ^
、 ./
与 /
、 .\
与 \
类似
rref(B)
所做工作:将 $B$ 化为行阶梯型最简形
$B=[A,b]$ 经过初等变换 $[A^{-1} A, A^{-1} b]$ 变成 $[E,x]$.
数组及其运算
一行或一列的矩阵是向量或数组。
数组的输入 :
和 linspace
(注意用法的区别)
1 | >> a=1:5 % 默认公差为1 |
linspace(a,b,n)
生成从a到b共n个数值的等差数组,公差 (b-a)/(n-1),公差为 1 时不必给出。
例:4 等分 $\pi$ 的数组
1 | >>x=0:pi/4:pi |
数组的运算: +
-
.*
.^
.\
./
数组的运算是对应位置元素的运算
语句 变量 表达式
语句形式:变量=表达式
若 “变量=” 省略,名为 ans
的变量自动被建立。表达式后用回车,则在工作区显示结果,如果表达式后用分号 ;
结束,则 Matlab 会计算,但不显示结果。一行中可以写几个语句,它们之间用逗号或分号隔开。
变量
Matlab 有它自己的一套变量命名规则
- 变量名区分大小写
Cost
cost
CoST
不同 - 变量名最多包含 31 个字符,其后的字符被忽略
- 变量名必须以一个字母开始,其后可以是限定条件内的任意数量的字母、数字、下划线,不允许出现标点符号。
错误范例:2a
_abc
Matlab 关键字不能用作变量名 保留字列表:
for
end
if
while
function
return
elseif
case
otherwise
switch
continue
else
try
catch
global
persistent
break
用户如果把这些保留字用作了变量名,Matlab 将会给出一条错误信息,但是用户可以将这些保留字中的某个字母改成大写,这样就可以用与这些保留字类似的词作变量名了。但是“不推荐”。
变量命名
变量名称应该表示其含义或用途。
1 | z = x * y |
对于程序阅读者来说,下面的表示更好
1 | wage = hourlyRate * nHours |
例子参考 MATLAB Style Guidelines 2.0
Matlab 的特殊变量
ans
用作结果的默认变量名beep
嘟嘟声pi
圆周率eps
浮点相对误差限 (22204×10-16)Inf
无穷大,比如 1/0NaN
不定值 比如 0/0i
或 j
虚数单位realmin
realmax
bitmax
最大正整数
字符串为由单引号括起来的字符集合,可以像向量一样进行裁剪和拼接。
函数
标量函数 (函数名均为小写)
三角函数:sin
(弧度) cos
tan
cot
sec
csc
asin
acos
atan
acot
asec
acsc
sinh
cosh
tanh
asinh
acosh
atanh
其他基本函数:sqrt
exp(x)
log
(表数学上 $ln$ 函数), log10
(表数学上 $lg$ 函数)
abs
round
floor
(表达 $[x]$) ceil
(表示 $[x]+1$) fix
(向 0 方向取整)
sign
real
imag
angle
获取辐角 conj
rat
以上这些函数本质上是作用于标量的,当它们作用于矩阵或数组时是作用于矩阵或数组的每一个元素。举例:
1 | >> x=(0:0.2:1).*pi; % x是有6个元素的行向量 |
另一个计算函数值的命令是 feval(F,x)
,F 是表示函数名的字符串。如:
1 | >> x=(0:0.2:1).*pi; |
向量函数
此类函数作用于行向量或列向量时才有意义,称为向量函数,这些函数作用于矩阵时,其结果为一个行向量,行向量的每个元素是函数作用于矩阵的相应列向量的结果。常用的有:
max
min
sum
length
mean
median
prod
连乘 sort
排序
具体用法 [y,z]=sort(x)
矩阵函数
Matlab中处理矩阵的函数大体分为两大类:构造矩阵的函数与进行矩阵计算的函数。对前者常用的有:
zeros
(0 阵) ones
(1 阵) eye
(单位阵) rand
(随机阵)
randn
diag
提取或者生成对角阵 triu
tril
对后者常用的有:size
(阶数) det
(行列式) rank
(秩) inv
(矩阵求逆) eig
(特征值) trace
(迹) norm
(范数) cond
(条件数)
lu
(LU分解) orth
(正交规范化) rref(A)
将A化成行阶梯形的最简形式,其中单位阵是极大线性无关组,其他列向量的坐标值为其对应列向量由该无关组表示的系数
命令和窗口环境
数据显示格式
Matlab 在显示数据结果时遵循如下原则:如果数据是整数则显示整数,如果数据是一个实数,缺省情况下显示小数点后4位数字。用户可以在 ?File 菜单下 Preference 菜单项或在命令窗口提示符下键入相应的 format
命令来指定其他数据格式
1 | Matlab命令 pi效果 说明 |
注意:format
只提供选择不同的显示格式,Matlab并没有改变数字的内部存储格式,仅是显示改变了而已。所有的计算仍然是用双精度计算的。
Matlab工作区
它是用来接受 Matla b命令的内存区域
- 显示:
who
whos
disp()
显示变量的内容 - 清除:
clear
clear A
clear C*
(清除所有以C打头的变量) - 储存:
save
用法:save 文件名 变量名
- 调出:
load
用法:load 文件名
- 记录:
diary
用法:diary filename
diary off
停止记录 - 搜索: Matlab文件所在的所有目录的列表被称为 Matlab 的搜索路径 Matlabpath
在Matlab启动时它将默认的搜索路径定义为它存储其文件的所有目录。修改方法是用路径浏览器 File->Set path项,更改的目的是将用户自己的包含 Matlab 文件的目录加入到搜索路径中。
MATLAB 程序控制结构
M 文件
分类:
脚本文件 (Script File)
函数文件 (Function File)
区别:
- 脚本文件没有输入,没有返回;
- 脚本文件可以对工作空间的变量操作,结果返回工作空间,而函数文件中的变量为局部变量,函数执行完毕,变量被清除;
- 脚本文件可以直接运行,函数文件见需要调用的形式运行 (除了特殊的函数文件外)。
顺序结构
按照代码顺序执行,即顺序结构,受控于代码前后位置;
使用于顺序结构中的简单输入和输出 (命令交互):
数据输入 (input
函数)
1 | >> A=input(‘输入一个参数') |
数据显示 (disp
函数)
1 | >> disp(A) |
程序暂停 (pause
函数)
->>pause(3)暂停 3 秒
分支结构
分支结构,又称为选择结构,包括 if 分支,switch 分支和 try 分支。
1、if 分支语句:
1 | if 条件 |
2、switch 分支语句
1 | switch 表达式 |
3、try 分支语句
在经典的程序设计语言中未出现,这是一种试探性的分支语句,也就是如果这条语句执行有错误,则不执行,或者执行其他的语句,提高了程序的容错性能。
1 | try |
循环结构
按照给定条件,重复执行某些语句,包括 for
循环和 while
循环。
1、for 循环语句
1 | for 循环变量=表达式 1:表达式 2:表达式 3 % 可以采用矩阵的形式 |
注意循环变量自动增加,在循环体内对循环变量的赋值操作会带来不可预料的程序执行。
2、while 循环语句
1 | while 条件 |
循环可以嵌套,但是在 MATLAB 中,循环的执行效率很低,因此应该尽量避免使用循环,更要避免使用两重以上的循环。
怎样避免使用循环和提高循环效率?
- 有些可以通过 MATLAB 的矢量化语言,通过矩阵或者向量操作完成;
- 有些可以通过 MATLAB 提供的一些特殊操作工具箱函数完成;
- 预分配的使用,会大大增加循环效率。
函数文件
1、基本结构:
1 | function [输出形参]=函数名([输入形参]) |
关于函数文件名:通常和函数名一致,如果不一致,那么忽略函数名,调用时使用函数文件名。
注释部分:注释部分可以提供 help
以及 lookfor
命令的查找功能,例如:
1 | function y = add_fun(a,b) |
对命令行进行注释快捷方式 Ctrl+R
,解除注释 Ctrl+T
2、函数参数的可调识别函数
可以完成传递参数的可调功能,类似于高级语言中的函数重载和多态。
nargin
返回传递给该函数调用的输入参数的数目,仅可在函数体内使用;nargout
返回该函数调用中指定的输出参数的数目;varargin
可变长度输入参数列表;c=varargin{1}
varargout
可变长度输出参数列表;
前两者为输入输出参数个数,后面两个可以代表未知的输入输出变量。error(nargchk(2,4,nargin))
检测 nargin
的范围在 2 到 4,如果超出则报错。
3、全局变量
使用 global
声明,可以提供不同的 M 文件访问同一个变量。
不同的函数之间访问同一个变量,可以通过返回参数来设置,或者使用全局变量。
4、程序调试
断点和单步;
根据错误提示,初步确定错误内容;
图形功能
plot 函数
基本用法:plot(x,y)
一般要求:x
和 y
为相同尺度的向量。
特殊用法:
x
为向量,y
为矩阵,其中一维与x
长度相同,则绘制多条不同色彩的曲线;x
和y
为同维的矩阵,以对应列绘制不同色彩的曲线;plot
有一个参数,若x
为实数向量,则绘制折线图,若x
为复数向量,则以实部和虚部为横坐标绘图;- 多个输入参数;
- 曲线选项。
1 | plot(x,y1,'k:',x,y2,'b-') |
示例:
1 | >> y=[0 0.58 0.70 0.95 0.83 0.25]; |
此时生成的是以序号1, 2, …, 6 为横坐标、数组 y 的数值为纵坐标的折线。
示例:
1 | >> x=linspace(0,2*pi,30); |
也可以在同一幅图上绘制多条曲线或直线
1 | >> z=cos(x); plot(x,y,x,z) |
用户也可以用 hold on
命令在一个已经存在的图形上添加新的图形,当用户输入hold on
命令后,在用户输入新的 plot
函数时,Matlab 不会将现有的坐标轴删除,如果新数据超出了当前坐标轴的限定范围,Matlab 就将坐标轴重新刻度。输入 hold off
命令就将当前图形窗口释放,用以绘制新的图形。
示例:
1 | >> x=linspace(0,2*pi,30); y=sin(x); z=cos(x); |
线型、颜色
用户可以通过在 plot
函数的每一组数据组对后添加第三个参数,声明用户自己的颜色、标记和线型。这个参数(可选)是一个字符串,放在单引号中。plot(x,y,‘s')
具体参数含义:
b
蓝色 g
绿色 r
红色 c
青色 m
洋红 y
黄色 k
黑色 w
白色
.
点 o
圆圈 +
加号 *
星号 s
方形 d
菱形 v
^ < >
三角形 (开口不同)
-
实线 :
点线 -.
点划线 --
虚线 p
五角星 h
六角星
网格与标记
1 | >> grid on % 将格栅线添加到当前图形中 |
用户可以用 text 函数在用户图形的任何指定位置给图形添加一个标签或者其他文本字符串。语法为:text(x,y,'string')
,其中 (x,y)
标明了以图形坐标轴的单位表示的文本字符串左边界的位置。更方便的是用鼠标确定字符串的位置,函数为 gtext(‘string')
。
坐标轴控制
1 | axis equal % 矩形的坐标轴 |
多幅图形
一个图形窗口可以包含多套坐标轴系。命令 subplot(m,n,p)
将当前窗口分成一个维数为 $m\times n$ 的绘图区域数组并将第 p 个绘图区域选定为当前绘图区域,编号规则为从最上边一行开始从左往右,然后第二行从左往右,一直到最后一行进行编号。
1 | >> x=linspace(0,2*pi,30); y=sin(x); z=cos(x); |
基本底层绘图函数
1、line 对象和 line 函数
示例:h = line([-pi:0.01:pi],sin([-pi:0.01:pi]))
产生 line 对象,h 为 line 对象的句柄
line 对象的修饰:
Color 属性;
LineWidth 属性;
LineStyle 属性;
Marker 属性;
MarkerSize 属性;
plot 绘制的图形也是 line 对象,可以通过 line 对象的修饰方法后期修饰。
1 | h = line('XDate',[-pi:0.1:pi],'YDate',sin([-pi:0.1:pi]),... |
2、底层标注
text 对象和 text 函数
常用修饰:
Color 属性;
String 属性;修改标注的内容
FontSize 属性;
Rotation 属性;
3、底层坐标轴的控制
axes 对象和 axes 函数
修饰:
Box 属性;
GridLineStyle 属性;网格线型
Position 属性;
Units 属性;可以设置单位为归一化 normalized,便于图形缩放
XLabel、YLabel 和 ZLabel 属性;
Xlim、Ylim 和 Zlim 属性;