1.1 MATLAB 软件介绍 h;mQ%9 Yd
LXOF{FG
在欧美各高等学校,MATLAB 软件成为线性代数、自动控制理论、数字信号处理、时间序列分析、动态系统仿真、图像处理等诸多课程的基本教学工具,成为本科生、硕士生和博士生的必须掌握的基本技能。 Jg?pW:}R
s^x ,S
主要用途: YC+ZVp"v
(1)数值和符号计算; ( kD?},Z
(2)绘图; >O[^\H!\
(3)一种语言体系,也可以方便地与 Fortran、C 等语言接口; PhaQ3%
(4)工具箱(Toolbox),分为功能性和学科性两种类。同时,其工具箱的数据文件代码完全开发,用户也可以开发自己的工具箱。 qoyGs}/I8
zv3<i (
功能性工具箱主要用来扩充 MATLAB 软件的符号计算功能、图视建模仿真功能、文字处理功能以及硬件实时交互功能。这种功能性工具箱用于多种学科。而学科性工具箱是专业性比较强的,如控制工具箱(Control Toolbox)、信号处理工具箱(Signal Processing Toolbox)、通信工具箱(Communication Toolbox)等都属此类。 M KE[Yb?
d#$i/&gE
MATLAB 语言的主要特点: /ux#U]x
(1)语法规则简单。与其他编程语言相比更接近于常规数学表达,对于数组变量的使用,不需类型声明,也无需事先申请内存空间。 +k"8e?/e.
(2)提供了数以千计的计算函数,极大的提高了用户的编程效率。 [Nzg
8FP
(3)是一种脚本式(scripted)的解释型语言,无论是命令、函数或变量,只要在命令窗口的提示符下键入并以回车键结束,则 MATLAB 都会予以解释执行。 m'vOFP)'
(4)可移植性,可跨平台运行。MATLAB 软件可以运行在很多不同的计算机系统平台上,包括大部分的 UNIX 和 Linux 系统,其编写的程序对应的数据文件是一致的,绘图功能也与平台无关。 \H'CFAuF
FPM}:c4
1.2 MATLAB 系统环境与数据操作 ,_7tRkn
KfI$'F
#"/
1.2.1 系统路径设置 p>hCh5
rea}Uq+po
两个路径概念: OW5|oG
(1)当前目录窗口:指 MATLAB 运行时的工作目录。只有在当前目录和搜索路径下的文件、函数才可以被运行和调用;如果没有特殊指明,数据文件也将存放在当前目录下。 ob()+p.k K
(2)搜索路径:指 MATLAB 执行过程中对变量、函数和文件进行搜索的路径。 F$pd]F!#
搜索路径是使用 MATLAB 时一个很重要的概念,MATLAB 具有大量的工具箱,用户在使用时也会设置大量的用户文件夹和文件,怎样让 MATLAB 能够识别出这些文件在哪里,这就是搜索路径需要确定的内容。 l2_E6U"
(注:MATLAB 启动后的默认目录是 C:\MATLAB\BIN 若不建子目录则MATLAB 环境产生的数据文件就登陆在这个缺省目录上。为了更加便于用户创建、修改 M 文件和其他文件,用户应建立自己的工作目录。) ?f%DVK d
键入字符识别的搜寻次序为: S7~l%G>]b
->>是否为变量 "NI>HO.U
->>是否为函数 mZ.6Njb
->>是否为当前目录下的 M 文件 M}RFFg
->>是否为搜索路径下其他 M 文件 &|,qsDK(
c`[uQXv
系统路径设置方法 Vu8-Cy>Q?
(1)path 指令,可设置扩展(临时)搜索路径。例: k?*DBXJv
path(path, ‘C:\tools\mydir’) 97=YFK~*
(2)cd 指令,可设置当前工作目录,该目录必须已存在。例: FWx*&y~$
cd E:\MATLAB ~+NFWNgN
(3)userpath 指令,可修改运行时默认路径。例: 7D1`^,?
userpath(‘D:\MATLAB’) (VF4]
(4)pathtool 指令,可直接更改、添加搜索路径。 ^bgm0,M
GA@Q:n8UuR
1.2.2 变量 的基本表达 _-2n3py
'm.XmVZL%
变量命名规则:以英文字母开头,可包括英文字母、数字和下划线,区分大小写,最多可包含 63 个字符(6.5 及以后版本)。 \<+47+
变量书写特点: InGbV+ I
(1)无需声明 o\Vt $
(2)末尾有分号,只执行不输出 Z`Eb
L
(3)回车符代表这句结束 }u$aPS<$!
(4)一行写不开,可用…续行 in|7ucSlg
(5)注释以%开头 pzp"NKxi
^)K[1]"uM
变量赋值的两种常见方式: +_K;Pj]x
->>变量=表达式,例: aLo>Yi
s = 1-1/2+3 WYd,tGz
输出结果:s = 3.5000 JqhVD@1{
->>表达式(赋值给默认变量 ans) #~qp8
w
2016/81 vnOF$6n
输出结果:ans = 24.8889 u+T, n
u~Cqdr5
\l
MATLAB 预定义的变量: @G-k]IWi
(1)ans,最近表达式计算结果的变量名; ~2qG"1[\
(2)eps,预设正的极小值,其值为 2.2204e-16; a5+v)F/=
(3)pi,圆周率 π; 4'e8VI0
(4)inf,无穷大,∞值; hA19:H=7R0
(5)i 或 j,虚数单元,sqrt(-1);
vX )Y%I
(6)NaN,非数,0/0,∞/∞。 #6Ph"\G/
注:用户只能临时覆盖这些预定义变量的值,Clear 或重启 MATLAB 可恢复其值。 X-^Oz@.>
^mb*w)-p?
变量查询方法: |?b"my$g$
(1)工作空间窗口显示; 0-O.*Q^
(2)who 和 whos 指令,列出在 MATLAB 工作空间中已经驻留的变量名清单。其中,whos 指令在给出变量名的同时,还给出它们的维数及性质。 ~Q\uP(!D
dfd%A"
I
清除变量方法: D#AxgF_He
->>clear 清除所有变量 G#M]\)f%
->>clear a 只清除变量 a ~x\Q\Cxp
&3/H
P)*<]
变量保存与调用: /JYi^rZ
命令 quit 和 exit 都可退出 MATLAB,结束工作任务会删除工作空间中的变量,可采用如下命令来保存工作空间,以备再次调用这些变量。 g9Qxf% }
I!#^F1p1
保存的指令格式: U?C{.@#w
(1)save,将工作空间中的所有变量保存到 matlab.mat 文件中。 #>oO[uaY
(2)save [文件名] [变量名],将指定的变量保存在指定文件中。如: 7!r`DZ"yF
save temp x y z AFA*_9Ut
把 x,y,z 这三个变量保存在文件 temp.mat 中。 AH,F[vS
在下次加载 MATLAB 时,可以利用 load 指令将保存在文件中的变量恢复到工作空间中,其格式有: |n%N'-el
(1)load,将保存在 matlab.mat 中的变量载入到 MATLAB 工作空间中。 d'J?QH!N0
(2)load [文件名] [变量名],从指定的文件中将指定的变量装入 MATLAB工作间。如: FNO
lR>0e
load temp x Sgy~Z^
只将 temp.mat 文件的变量 x 载入到 MATLAB 工作空间中。 '0?E|B]Cp%
Q)dns)_x
1.2.3 数据、操作与显示 CK#PxT?"
j>M%?Tw
数字的计述: 0w&1wee(
MATLAB 的数值采用习惯的十进制表示,可以带小数点和负号,其缺省的数据类型为双精度浮点型(double)。例: sbIhg/:ok
3 -99 0.0013 1.243e-6 8=Ht+Br
表达式按常规相同的优先级从左至右执行运算,指数运算级别最高,乘除次之,加减最低。 B75SLK:h=
加+ 减- 乘* 左除\ 右除/ 幂^ 7K4%`O
注:对于标量而言,左除和右除的作用相同,但对矩阵运算产生不同的影响。 <6 $%Y2
T!E LH!
在缺省的状态下 MATLAB 以短格式 short 格式显示计算结果。可以用MATLAB 命令窗口中 format 指令来改变数字的显示格式。由于 MATLAB 以双精度执行所有运算,显示格式的设置仅影响矩阵的显示,不影响矩阵的计算与存储。 &"0[7zgYQz
如果矩阵的所有元素都是整数,则矩阵以不带小数点的格式显示。如果有一个元素不是整数,则有几种输出格式。默认格式为 short格式,只显示 5 位有效数字,其他的显示格式可显示更多的有效数字,还可用科学表示法。 *mtv[
->>format short e 短格式科学表示; a-=apD1RvG
->>format short g 在 short 和 short e 中自动选择最佳方式; ?uv%E*TU
->>format long 长格式(15 位有效数字); }_TdXY
#w\
->>format long e 长格式科学表示; )QT+;P.
->>format long g 在 long 和 long e 中自动选择最佳方式; 3E9j%sYk
->>format bank 银行格式; ShxX[k
->>format rat 近似有理数表示; >{8H==P
->>format hex 十六进制格式; Grv|Wuli
->>format compact 紧凑格式。 n&JP/P3Y
…… =jh:0Q<43+
["9$HL
字符串相关函数: i>}z$'X
class( )函数,可查看数据类型 _FgeE`X
double( )/abs( )函数,可将字符串转换成 ASCII 码 vZsVxx99
str2num( )/num2str( )函数,实现字符串与数字之间的转换。 i{0_}"B
eval( )函数,执行字符串变量中的内容。 Pl>t\`1:|A
W=:+f)D
1.3 MATLAB 帮助/命令查询 C]cw@:o%
r8$TT\?~
MATLAB 的在线帮助系统相当完备,就查询系统的调用方式而言,可分为两种: RPQ)0.O7
(1)从 MATLAB 指令窗的 help 菜单选项中寻求帮助此与一般 windows的求助方法一样 .(ir2g
(2)在 MATLAB 指令窗中直接键入帮助指令。 3dLz=.=)'
->>help 不带任何参数,显示出 MATLAB 的目录项产生清单信息; '@P[fSQ
->>help 目录名(lang/ matfun/ elfun),显示指定目录中的所有命令及其函数; <NO~TBHF
->>help 命令名/函数名/符号,显示指定的命令名/函数名/符号的详细信息。 SqQB>;/p
lookfor 指令可以根据用户提供的完整或不完整的关键词,去搜索出一组与之有关的指令。 Y#,MFEd
exist 指令,检查指定名字的变量或函数文件的存在性; e^TF.D?RS
what 指令,按扩展名分类列出在搜索路径中指定目录上的文件名; O'(vs"eN
which 指令,列出指定名字文件所在的目录。 hd' n"
Wi<Fkzj
注:help 的工作机理是把指定名字的那个 M 文件的第一段注释内容显示出来,以构成自己文件的再线求助。lookfor 指令的机制是对 MATLAB 中的每个 M文件注释区的第一行进行扫描,一旦发现包含要查询的字符串就显示出来。用户也可利用此机理建立自己文件的在线帮助。 g<Xwk2_=g
g(^l>niF:
1.4 MATLAB 的矩阵操作 c#Bde-dh
:W"ITY(
1.4.1 矩阵的建立 ,8seoX^
~r3g~MCHS
(1)直接输入法 +l\Dp
->>在命令窗口直接输入矩阵元素; Heu@{t.[!D
->>按行输入矩阵元素,同一行元素使用空格或者逗号隔开,不同行元素使用分号或者回车作为间隔。 4j5 "{
FqfeH_-U
(2)M 文件建立矩阵 )g9qkQ 8q
->>启动编辑器(输入 edit 命令,或者使用菜单栏按钮);
D6pk!mS
->>输入待建立矩阵,输入格式要求和直接输入法类似。 @U5o;X!qU
Qd&j~cG@
(3)zeros( )和 ones( )函数 8*X8U:.0o
T7`Jtqf
(4)冒号表达式建立向量 iuEdm:pW
冒号是一个重要的运算符,语法: {H74`-C)W
e1:e2:e3 FgxQ}VvlH
e1 为初始值,e2 为步长(默认为 1),e3 为终止值,产生行向量; ]Az >W*Y
t$J-6dW
(5)linspace 建立行向量 K""04Ew*pV
语法: AyUVsIuPT=
linspace(a,b,n) ;A_QI>>
a 和 b 分别为行向量的第一个和最后一个元素,n 为总元素,省略 n 自动产生 100 个元素的行向量 `/O_6PQ}
=z+zg^wsT
1.4.2 矩阵的简单操作 X%sc:V
?(z3/"g]
(1)索引矩阵 5ym
=2U
->>可以使用矩阵元素的行标和列标或者矩阵元素的位置索引来索引矩阵元素; 'JydaF~>
->>行标和列标共同使用的形式; +?8nY.~,'
->>使用序号索引,涉及到 MATLAB 中矩阵的存储形式; Nf1l{N
矩阵元素的存放是按照列来排序 -9mh|&z`
find(A==8)或 find(A,8)返回 A 矩阵内值为 8 的元素序号;find(A<8)返回所有小于 8 的序号; w[iQndu
->>序号和下标的转换。 %PpB$
sub2ind(size(A),m,n)返回序号 PuWF:'w r
[m,n]=ind2sub(size(A),3)返回下标 .gB*Y!c7
tF4"28"h
(2)重排矩阵 DIY WFVh
->>A=[1,2,3;4,5,6;7,8,9] > 01k
u
->>E=reshape(A,9,1)重排为 9×1 列向量 YeQX13C"Z
->>I=A[:]同上效果 ]Q+Tm2{
V>hy5hDpH
(3)矩阵的转置 4D8q Gti
->>L=K’ UU_k"D~
>. A{=?
(4)矩阵的拆分 :\ S3[(FV
->>K=A(1,:)获得第一行所有列的内容 |b@-1
->>K=A(1,1:end)效果同上 lH[N*9G(
->>K=A(1,1:2) 获得第一行 1 到 2 列的内容 jm!G@k6TA
->>K=A(1,[1 2])效果同上 KQk;:1hW
->>K=A([1 2],[1 2]) x|Dj
jGt[[s
(5)删除矩阵元素 QS[%`-dR2
->>赋空值,例如: g$ h!:wW
M(2)=[ ] b|EZ;,i
A(1,:) =[ ] {x+jFj.
u+*CpKR}
(6)扩展矩阵元素 83@+X4ptp
->>Q=repmat(A,2,1) 9T\:ID=h
将[1 2 3 4]扩展为[1 2 3 4;1 2 3 4] ']V 2V)t
!cfn%+0
(7)压缩矩阵元素 Fw|5A"9'a'
->>R=[1 2 3 3 3 4 4] {2,V3*NF
->>Q=unique(R)只保留不重复的元素 U7OW)tUf
l)?c3
1.4.3 矩阵的处理基础 wFh{\
h5~tsd}OU
MATLAB 运算以矩阵为单位,可以直接实现矩阵的加法、数乘等运算以及矩阵的行列式、矩阵的秩、矩阵的逆以及转置等运算。 A&z
计算 A 的行列式;
@>BFhH
->>使用 det(A)函数 j0Q;OKu
如果 A 的行列式不为 0,那么计算 A 的逆; A2xORG&FD
->>使用 inv(A)函数 "`lRX
bygwoZ<E
向量可以看作是 1×n 矩阵或者 n×1 矩阵,因此向量的加法和数乘等运算和矩阵式一样的。 2D
"mq~V
求向量内积(a,b)=b H a; "kMpa]<c-6
->>sum(conj(b).*a) N-suBRnW
->>a*b’,与上式一致 vJYy` k^Y
->>dot(b,a),与上式一致 h5F1mr1Sa
uvT]MgT
线性方程组求解 6 ,k}v:
可以使用矩阵求逆的方法求解线性方程组,在一般线性代数中的解决方法类似。 >J4_/p>Qs
->>x=inv(A)*b &cZD{Z
->>x=A\b,与上式一致 u+hzCCwtR
7.]ZD`"Bb
矩阵的相似化简和分解 7-)Y\D
求解 A 的 Jordan 标准型; |[gnWNdR$M
->>使用 jordan(A)函数 sC/T)q2
求解 A 的特征值; /7*u!CNm
->>使用 eig(A)函数 E_FseR6
范数运算,包括 1 范数,2 范数和无穷范数以及 f 范数; <#:"vnm$j
->>使用 norm 函数,norm(A,1),norm(A,2),norm(A,inf),norm(A,’fro’) /QTGZb
mgS%YG
函数分析 .t\5H<z
计算函数矩阵 A(x)的一阶和二阶导数。在 MATLAB 中函数的计算,比如求导数,默认对矩阵的每一个元素求导,这即为函数矩阵导数的计算方法。 {<bByHT!
->>syms x 07CGHAxJ`
->>A=[sin(x) exp(x) 1;cos(x) x^2+1 log(x)] S53[K/dZo
->>diff(A),一阶导数 d"$ \fL
->> diff(A,2),二阶导数 9^`G `D
Ry,jPw5<
计算矩阵函数,e A ,sinA,cosA。在 MATLAB 中使用 funm 函数计算矩阵函数,funm 为通用矩阵函数计算函数,其使用方法如下: k)'c$
funm(A,@fun) 8%Pjx7'<
->>funm(A,@exp),求 e A \s[Uq
->>expm(A),同上 Up`zVN59.
->>funm(A,@sin),求 sinA ky,+xq
->>funm(A,@cos),求 cosA <UeO+M(
ceAK;v
o
1.5 MATLAB 程序控制结构 kpEES{f
Aj-}G^>#
1.5.1 M 文件 X=-pNwO
\3x,)~m
分类: `XQM)A
命令文件(脚本文件,Script File) Z|E( !"zE9
函数文件(Function File) )'92{-A0
j&ddpS(s
区别: Ju+r@/y%
命令文件没有输入,没有返回; JeuW/:Wv
命令文件可以对工作空间的变量操作,结果返回工作空间,而函数文件中的变量为局部变量,函数执行完毕,变量被清除; amOBUD5Ld`
命令文件可以直接运行,函数文件见需要调用的形式运行(除了特殊的函数文件外)。 8\/E/o3
R|`}z"4C
1.5.2 顺序结构 ]e 81O#t3
Bx2E9/S3
按照代码顺序执行,即顺序结构,受控于代码前后位置; }wz )"
使用于顺序结构中的简单输入和输出(命令交互): u.R:/H<>~
数据输入(input 函数) J=5G<
->>A=input(‘输入一个参数’) tvZpm@1
数据显示(disp 函数) g;Bq#/w
->>disp(A) HX?5O$<<N
程序暂停(pause 函数) H"6:!;9,
->>pause(3)暂停 3 秒 `
Y"Rh[C
p<tj6O
1.5.3 分支结构 $GPenQ~},
$wAVM/u&
分支结构,又称为选择结构,包括 if 分支,switch 分支和 try 分支。 t: r
(1)if 分支语句: ~%m-}Sxc
if 条件 yD(0:g#
语句组 1 qK#\k@E
else c(i-~_
语句组 2 Ay/ "2pDZ
end e%o6s+"
=k'3rm*ld
(2)switch 分支语句 0;
M+8
switch 表达式 ?E=&LAI#
case 表达式 1 Fn yA;,*
语句组 1 %
=br-c
case 表达式 2 .^fq$7Y}7
语句组 2 77.5
_
… [?yOJU%`
case 表达式 n
JstX# z
语句组 n `dx+Qp
otherwise [-=PK\ B
语句组 m }2-{4JIq}
end 48Z{wV,
[wi "
(3)try 分支语句 ;XRLp:y
在经典的程序设计语言中未出现,这是一种试探性的分支语句,也就是如果这条语句执行有错误,则不执行,或者执行其他的语句,提高了程序的容错性能。 fOF02WP^
try `b+f^6SJn
语句组 1 \ 2*<Pq
catch rX)PN3TD
语句组 2 ]@)X3}"!
end ?x%HQ2`
Jr==AfxyT
1.5.4 循环结构 xzbyar<
按照给定条件,重复执行某些语句,包括 for 循环和 while 循环。 ej]^VS7w[r
?S36)oZzg
(1)for 循环语句 gQCkoQi:j
for 循环变量=表达式 1:表达式 2:表达式 3(可以采用矩阵的形式) cL7je
循环体 "9>~O`l,
end fr4#<6,
注意循环变量自动增加,在循环体内对循环变量的赋值操作会带来不可预料的程序执行。 3 8m5&5)1F
r*OSEzGUz
(2)while 循环语句 j|A *rzL8
while 条件 b,cA mZ
循环体(break 命令可跳出) j]6Z*AxQ
end
![18+Q\
k:nr!Y<
循环可以嵌套,但是在 MATLAB 中,循环的执行效率很低,因此应该尽量避免使用循环,更要避免使用两重以上的循环。 r=~yUT
怎样避免使用循环和提高循环效率? != _:*U)-'
有些可以通过 MATLAB 的矢量化语言,通过矩阵或者向量操作完成; &gw. &/t
有些可以通过 MATLAB 提供的一些特殊操作工具箱函数完成; z
AacX@
预分配的使用,会大大增加循环效率。 (dLt$<F
BOQ2;@:3
1.6 MATLAB 编辑器和程序调试 7
g8SK
<=l!~~%
(1)函数文件 @TdPeTw\
基本结构: h7)^$Hd
function [输出形参]=函数名([输入形参]) k3da*vwE
[注释说明] TxoMCN?7c
函数体 3?|Fn8dQR.
关于函数文件名 4L 85~l
通常和函数名一致,如果不一致,那么忽略函数名,调用时使用函数文件名。 q&B'peT
注释部分 >JkQU e
注释部分可以提供 help 以及 lookfor 命令的查找功能,例如: Ou"QUn|
—————————— eu@-v"=w
function re = add_my(a,b) %M2.h;9]*\
%ADD_MY 完成变量 a 和 b 的相加 mnzamp
% 输入: a 加数 1 Cg
|_) _w
% b 加数 2 lbZ,?wm
% 输出: re 为两个参数相加之和 7[rn
,8@
% 3k`"%R.H
% $Author:XXX R] tHd=kf
% $Date: 2017.02.10 <*3{Twa1T
% Version: V1.0 WO?EzQ ?
,B(UkPGT
re = a + b gbL99MZ@~
—————————— (YVl5}V
对命令行进行注释快捷方式 Ctrl+R,解除注释 Ctrl+T \bw71( Q
S7N3L."
(2)函数参数的可调识别函数 !@{_Qt1
可以完成传递参数的可调功能,类似于高级语言中的函数重载和多态。 T^B&GgW
nargin 返回传递给该函数调用的输入参数的数目,仅可在函数体内使用; kj~)#KDN
nargout 返回该函数调用中指定的输出参数的数目; $Q{)AN;m
varargin 可变长度输入参数列表;c=varargin{1} rk*Igqf
varargout 可变长度输出参数列表; p%EU,:I6
前两者为输入输出参数个数,后面两个可以代表未知的输入输出变量。 4(o: #9I
error(nargchk(2,4,nargin))检测 nargin 的范围在 2 到 4,如果超出则报错。 7h?PVobe
Z$ Fh4
(3)全局变量 "IA[;+_"
使用 global 声明,可以提供不同的 M 文件访问同一个变量。 !MSz%QcO
不同的函数之间访问同一个变量,可以通过返回参数来设置,或者使用全局变量。在 GUI 中,也可以通过其他方式完成(GUI 数据,app 数据等)。 PX65Z|~>_
<6Q]FH!6
(4)程序调试 "#z4
断点和单步; )tl=tH/$
根据错误提示,初步确定错误内容;