第二章 MATLAB程序设计
2.1 数据类型和运算符
2.2 程序控制语句
2.3 矩阵运算
2.4 多项式
2.5 函数与 M文件
2.6 数据的可视化
2.1 数据类型和运算符
变量、语句
? 变量命名规则
⑴ 必须以字母开头;
⑵ 可以由字母, 数字和下划线混合组成;
⑶ 变量长度应不大于 31个;
⑷ 字母区分大小写 。
?变量的定义
?特殊变量
变量名称 功能 变量名称 功能
a ns 保存最后一次的运算结果 pi 圆周率
r e a l m a x 最大的浮点数值 r e a l m i n 最小的浮点数值
I 虚数单位 j 虚数单位
I nf 正无穷大 N a N 非数( 0/ 0, I n f / I n f )
?基本语句
MATLAB语言的基本语句结构为:
变量名列表 =表达式
等号左边的变量名列表为 MATLAB语句的返回值, 若一次返回多个结果,
则变量列表用 [ ]括起来, 各变量间用 逗号 分隔;
等号右边为表达式, 可以是矩阵运算或函数调用, 可以由 分号 (;),逗号 (,)
或回车 结束 。
数据类型
在 MATLAB里共有六种数据类型,每一种类型可以是一维、二维和多维的。
?双精度型( double)
?字符型( char)
?稀疏型( sparse)
?存储型( storage)
?细胞型( cell)
?结构型( struct)
?字符型
基本规则:
⑴所有字符串都用单引号括起来;
⑵字符串中的每一个字符都是该字符串变量中的一个元素;
⑶字符串中的字符以 ASCⅡ 码形式存储,因而区分大小写。
常用操作方法:
⑴建立:常用函数有 char,int2str,num2str等。
⑵连接:水平连接通过函数 strcat或在中括号内用逗号连接;
垂直连接通过函数 strvcat或在中括号内用分号连接。
⑶比较:常用函数 strcmp,相同则返回 1,否则为 0。
⑷查找:常用函数 findstr。
?结构型
结构的建立和访问方法:
①直接建立结构和各个域,同时给各域赋值,结构和域之间用点“.”
连接。同样,访问结构的各个域时,其格式为:
结构名.域名
② 用函数 struct建立结构,其用法为:
s=struct(‘field1’,values1,‘field2’,values2,┅ )
例 2-1 s = struct('type',{'big','little'},'color','red‘,‘x',{3 1})
Field values1 values2
Type big little
Color red red
X 3 1
s(1).type; s(2).type
s(1).color; s(2).color
s(1).x; s(2).x
1× 2 struct
运算符
?算术运算符
+ 加,^ 数组幂
- 减 \ 左除或反斜杠
* 矩阵乘法 / 右除或斜杠
.* 数组乘法,/ 数组除
^ 矩阵幂, 冒号
按照运算符的优先级可把算术
运算符分为五级,在每一级里
运算符有同样的优先级,在运
算时自左向右结合
?关系运算符
在 MATLAB里共有六个关系运算符
< 小于 > 大于
<= 小于等于 >=大于等于
== 等于 ~=不等于
关系运算符将生成一个 0-1矩阵,当运算数相应元素为真时,对应
位置上生成 1,否则为 0。
?逻辑运算符
& (与 ) |(或 ) ~(非 )
结果是一个 0-1矩阵。当逻辑表达式的值为真时,赋值 1,否则为 0
?逻辑函数
all函数, 当某列的元素都为真时,返回值为 1,否则返回 0。最终运
算结果为一个 0-1行向量
any函数, 当向量中至少有一个元素为真时,返回值为 1,否则返回
0。最终运算结果为一个 0-1行向量
find函数, 用于查找向量中的真元素的下标,返回由所有真元素下
标构成的列向量。
例 2-6 例 2-7例 2-5
2.2 程序控制语句
? 循环语句
MATLAB中的循环语句包括 for循环和 while循环两种类型 。
? for循环
for循环的基本格式为:
for 循环变量 =起始值:步长:终止值
循环体
end
步长的缺省值是 1。 步长可以在正实数或负实数范围内
任意指定, 对于正数, 循环变量的值大于终止值时, 循环
结束;对于负数, 循环变量的值小于终止值时, 循环结束 。
例 2-8-1
? while循环
while循环的基本格式为:
while 表达式
循环体
end
若表达式为真, 则执行循环体的内容, 执行后再判断表
达式是否为真, 若为假则跳出循环体, 向下继续执行, 否则
继续执行循环体 。
break,从循环体中跳出,并使循环结束。
例 2-8-2
? if- else- elseif语句
?if格式:
if 逻辑表达式
执行语句
end
当逻辑表达式的值为真, 则执行该结构中的执行语句内容, 执行
完后向下继续执行, 若逻辑表达式的值为假, 跳过结构中的执行语句
继续向下执行 。
?if-else格式
if 逻辑表达式
执行语句 1
else
执行语句 2
end
如果逻辑表达式的值为真, 则执行语句 1,然后跳过语句 2向下执
行;若逻辑表达式的值为假, 则跳过执行语句 1而执行语句 2,然后向
下执行 。
? if-elseif格式
if 逻辑表达式 1
执行语句 1
elseif 逻辑表达式 2
执行语句 2
……
elseif 逻辑表达式 n
执行语句 n
else
执行语句 el
end
如果逻辑表达式的值为真, 则执行语句 1,若逻辑表达式的值
为假, 则判断逻辑表达式 2的值, 若为真, 则执行语句 2,否则向
下执行,若所有表达式均为假, 执行语句 el 。
例 2-8-3
? switch语句
switch语句的格式为:
switch表达式 ( 标量或字符串 )
case值 1
语句 1
case值 2
语句 2

case 值 n
语句 n
otherwise
语句 ow
end
表达式的值和哪种情况 ( case) 的值相同, 就执行哪种情况中的语句,
如果都不同, 则执行 otherwise中的语句 。
输入简单的矩阵
在 MATLAB中不必描述矩阵的维数和类型,而由输入的格式和内容来决
定。输入小矩阵最简单的方法:把矩阵的元素直接排列到 方括号 中。每 行
内的 元素 间用空格( space)或 逗号 (,)分开,行与行的内容间用 分号
(;)隔开。
下标引用
?矩阵下标( 按列优先排列 )
?用两个下标来表示。 第 i行 j列的元素用 A(i,j)来表示
?用一个下标来表示。 对于矩阵按列操作,可用单下标引用 A(i) 。
?在下标的表达式中使用冒号表示矩阵的一部分。
?下标引用从序号 1开始。
例如,A(1:k,j)表示矩阵 A的第 j列的前 k个元素。
A(:,j)表示矩阵 A的第 j列的所有元素。
2,3 矩阵运算
?矩阵的组合
?矩阵的抽取
例 2-9
例 2-10
?删除矩阵的行和列
例 2-11
把空的 [ ]称为空矩阵,即矩阵大小为 0× 0。可以通过把矩阵的行或
列赋值为空矩阵来删除某行或某列。
X= [ ] %将一个 0× 0的矩阵赋给 X
A(:,[2 4]) =[ ] %则将 A的第二列和第四列删除了
A(:,2)=[] %删除矩阵 A的第二列
矩阵的组合即把小矩阵组合成大矩阵,组合符号为中括号 []。
用下标可以从大矩阵里面抽取某些元素组成小的矩阵,并使用()运算符。
矩阵运算
?矩阵的加减
使用+, -运算符, 并满足以下两个条件之一:
(1)类型相同, 即行数相等, 且列数相等 。
(2)其中一个为标量, 则矩阵中每一个元素都和标量做加减运算 。
例 2-13
?矩阵的乘积
使用 *运算符,必须满足维数条件。
?矩阵的除法
例 2-14
除法运算其意义相当于矩阵的求逆运算 。 还定义了矩阵的左除及右除 。
? 矩阵的左除:, \” A\B 即由 Gauss消去法求线性方程 AX=B的解 X=A-
1B
? 矩阵的右除:, /” B\A是方程 XA=B的解 X=BA-1
"′ "表示复共轭转置,".′ "表示普通转置。
?矩阵的转置
?矩阵的点运算
例 2-15
两个矩阵之间的点运算是对该矩阵对应元素的直接运算。点乘积运算要
求矩阵的维数相同。点乘积又称为 Hadamard乘积。常用的点运算包括:
.*,./,.\,.’,.^。
例 2-16
矩阵函数
?三角分解
将一个方阵表示成两个基本三角阵的乘积,其中一个三角阵为上三角
阵,另一个为下三角阵。这种分解被称为 "LU分解 "。
[L,U]=lu(A) %求矩阵 A的 LU分解
X= inv( A) %求矩阵 A的逆矩阵
d=det(A) %求矩阵 A的行列式
?三角分解
d= eig( A) ;
[V,D]= eig( A) ;
[V,D]= eig( A,'nobalance')
求解 A矩阵的特征值和特征向量,其调用格式为:
d为矩阵 A的特征值向量; D为 A阵的特征值对角阵, V为 A阵的全部
右特征向量, ; nobanlance选项当 A矩阵中有的元素小到和截断误差
相当时用, 一般用 nobalance选项来减少计算误差 。
?矩阵的尺寸
为了判断矩阵的尺寸, Matlab提供了以下函数:
[m,n]=size(A) %返回矩阵的行数 m和列数 n
M=size(A) %在矩阵 M中返回矩阵的行数, 列数
len=length(A) %返回矩阵 A行数和列数中的最大值
?特殊矩阵的生成
例 2-161
?单位矩阵
eye(n) %生成 n维单位阵
eye(m,n) %生成 m× n的单位阵
eye([m,n]) %生成 m× n的单位阵
eye(size(A)) %生成与 A矩阵同样大小的单位矩阵
?全 1矩阵
ones(n) ones(m,n) ones([m,n]) ones(size(A))
?全零矩阵
zeros(n) zeros(m,n) zeros([m,n]) zeros(size(A))
?随机矩阵
rand(n) rand(m,n) rand([m,n]) rand(size(A))
生成的随机矩阵的各个元素值在 0和 1之间。
?魔术矩阵
magic(n)
魔术矩阵的所有行元素和、列元素和、对角线元素和均相等。
2.4 多项式
?多项式的创建
?多项式的常用函数
roots ( ) %求多项式的根
p=poly(A) %求矩阵的特征多项式
polyval( p,x) %求当多项式 p的参数为某个特定值 x时的多项式的值
polyvalm(p,A) %和 polyval作用相同, 输入参数值也可为方阵 A
例 2-17
?多项式用行向量表示。
?多项式 P( x) = an xn+ an-1xn-1+… + a1x + a0,
其系数向量表示为,P= [an,an-1,…, a1,a0 ]。
直接输入法 例如,P=[1,2,3,4]
poly(A) %创建方阵 A的特征多项式
poly(a) %如果 a为向量 [bn bn-1… b1 b0],
则创建 (x-b0 )( x-b1)… (x-bn-1 )(x- bn )生成的多项式的系数向量
?卷积和解卷积
c=conv(A,B) %卷积函数, 多项式乘法函数
[Q,R]=deconv (A,B) %解卷积函数, 多项式除法函数
polyder:用于计算两个多项式的积, 单个多项式和两个多项式的商
的导数, 其调用格式为:
Pd= polyder(P) %求多项式 P的导数
Pm= polyder(P1,P2) %求多项式 P1和多项式 P2的乘积的导数
[Q,D]=polyder(P1,P2) %求多项式 P1除以多项式 P2商的导数
?多项式曲线的拟合
从最小二乘的意义上,polyfit函数将拟合出所给数据的多项式系数,
其调用格式为:
p=polyfit(x,y,n)
其中,x和 y为已知数据的横坐标和纵坐标向量,n为多项式的次数。
例 2-18
例 2-19:已知五个数据点,[1,5.5],[2,43],[3,128],[4,290],[5,498],试画出这
五个点拟合的三次曲线。
2.5 函数与 M文件
用 Matlab语言编写的可以在 Matlab环境中运行的程序称为 M文件。
M文件以,m为扩展名,M文件分为两种:命令文件和函数文件
命令文件
?命令文件没有输入参数也没有输出参数,只是一些 Matlab命令和函数的
组合。
?命令文件可以操作工作空间的变量,也可以生成新的变量,
?当命令文件执行结束后新变量将保存在工作空间中,不会被自动清除。
例 2-20,编写命令文件,用于求解小于 2000且为 2的整数次幂的正整数。
函数文件
?函数允许通过数值进行参数传递,而且函数使用局部变量而不是全
局变量操作。
?函数文件的第一行必须包括, function”这个关键字。函数文件的文
件名必须和函数定义的函数名称相同。
程序文件与函数文件的主要区别
函数接收输入参数,返回输出参数。函数文件也是以,,m”为扩展名,
MATLAB的函数 M文件通常由以下几个部分组成:
?函数定义行
函数 M文件的第一行用关键字, function”把 M文件定义为一个函数,
并指定它的名字,并且与文件名必须相同,同时定义了函数的输入和输入
参数。输入参数的定义用小括号(),如果有多个输入参数则用逗号分隔;
输出参数的定义用中括号 [],如果有多个输出参数则用逗号分隔。
?H1行
所谓 H1行指帮助文本的第一行,它紧跟在定义行之后并以, %”符号开头,
用于概括说明函数名和函数的功能。在命令窗口用 lookfor命令时将显示所寻求
函数的 H1行。
?函数帮助文本
帮助文本指位于 H1行之后函数体之前的说明文本,它同样以, %”符号开头
,一般用来比较详细地介绍函数的功能和用法。在命令窗口用 help命令时将显
示函数的 H1行和所有帮助文本。
?函数体
是函数的主体部分,包括进行运行和赋值操作的所有 MATLAB程序代码,其
中可以有流程控制、输入输出、计算、赋值、注释以及函数调用等操作。
?注释
除了函数开始独立的帮助文本外,还可以在函数体中添加对语句的注释。注
释必须以, %”符号开头,MATLAB在编译执行 M文件时把每一行中, %”后面
的全部内容作为注释不进行编译。
一个 M文件中可以定义多个函数, 其中第一个定义的函数称为主函
数, 主函数名必须与 M文件名相同, 其它函数称为子函数 。 子函数只能
被定义它的文件中的函数调用, 其它函数和文件不能调用 。
子函数
例 2-21:编写函数 AddJc( n),求 ?
?
n
k
k
1
!
2.6 数据的可视化
图形窗口
?MATLAB自动将图形画在图形窗口上;
?图形窗口相对于命令窗口是独立的窗口;
?图形窗口的属性由系统和 MATLAB共同控制;
常用图形窗口命令格式:
figure %建立一个新的图形窗口,并指定为当前窗口用于图形输出
subplot %把多个图形绘在一个图形窗口中。
subplot(m,n,I) %把图形窗口分成 m× n个小图形区域,并指定第 i个区域
为图形的绘制区域。图形区域的编排采用 行优先 。
例 2-22
基本的绘图命令 plot
? 功能,plot是最基本的二维图形命令, 它是以 MATLAB的内部函数形式
出现的 。 MATLAB的其他二维函数中的绝大多数是以 plot为基础构造的绘
图命令 。
? 格式,plot( y), plot( x,y), plot( x1,y1,x2,y2,…)
? 说明:
( 1) plot( y),当 y为向量时, 则以 y的元素为纵坐标, 以相应元素下
标为横坐标, 绘制连线图 。
( 2) plot( x,y),当 y和 x为同维向量, 则以 x为横坐标, y为纵坐标
绘制连线图 。
( 3) plot( x1,y1,x2,y2,… ):每对 x,y必须符合 plot( x,y)中的要
求,不同对之间没有影响,命令将对每一对 x,y绘制曲线。
例 2-23
常用绘制二维图形的命令
函数 轴的刻度方式
Loglog 纵横轴均采用对数坐标
Semilogx 纵轴采用线性坐标, 横轴采用对数坐
标Semilogy 纵轴采用对数坐标, 横轴采用线性坐
标plotyy 在图的左右两侧分别建立纵坐标轴
基本绘图控制
数据的可视化的一般步骤为:
① 准备绘图需要的数据;
② 指定绘图的窗口或者区域;
③ 调用基本绘图命令;
④ 选择线型, 颜色, 数据点形状;
⑤ 坐标轴控制, 包括显示范围, 刻度线, 比例, 网格线;
⑥标注控制,包括坐标轴名称、标题、相应文本等。
?plot控制
?功能:在调用函数 plot时, 可以指定线型, 颜色, 和数据点的图标 。
?格式,plot( x,y,‘ color_linestyle_marker’)
?说明:参数 color_linestyle_marker 为一个字符串,由颜色、线型、数据
点的图标组成。
颜色字符定义表
字符定义 颜色 字符定义 颜色
y yellow( 黄 ) m magenta( 洋红 )
c cyan( 青 ) r red( 红 )
g green( 绿 ) b blue( 兰 ) 默认
w white( 白 ) k black( 黑 )
线型字符定义表
字符定义 线型 字符定义 线型
- 实线 ( 默认 ) -- 虚线
,点划线 -,点连线
none 无线
? 坐标轴控制
? axis( [xmin,xmax,ymin,ymax])
指定轴的显示范围, 四个输入参数分别为横轴显示的最小值和最大值,
纵轴显的最小值和最大值, 可以用 Inf和 -Inf表示 。
? axis square
一般情况下, MATLAB给出的图形窗口不是正方形, 所有显示的图形区
域也不是正方形 。 对应两轴的比例, 一般也是不相等的 。 可以用此命令指定
两轴的显示的长度相同 。
? axis tight
用于绘制指定数据的范围 。, equal”和, tight”也可以同时选中 。
? axis equal
用于指定两轴的显示比例相同 。
? set(gca,’xtick’,[…… ]),set(gca,’ytick’,[…… ])
设置横轴 ( X轴 ), 纵轴 ( Y轴 ) 的刻度线, 第三个输入参数是一个刻度
向量, 并按照等分升序原则排列 。
例 2-24
?删格控制,控制图形窗口的栅格是否被显示。
grid on %显示栅格
grid off %隐藏栅格
?追加控制,控制绘图方式,即在当前窗口绘图时是否清除原窗口上来的图形
hold on %绘图时不清除绘图窗口中原有的图形
hold off %绘图时清除绘图窗口中原有的所有图形
?标注控制,图形上加上适当的文字说明。
xlable(‘string’,‘FontSize’,size),ylable(‘string’,FontSize’,size)
显示坐标轴的名称,string为坐标轴名称字符串,size为使用的字体尺寸
title(‘string’,‘FontSize’,size)
显示整个图形的标题,string为标题字符串,size为字体大小。
text(x,y,‘stirng’)
在绘图窗口的坐标 (x,y)处显示字符串 string。
作业
习题 1,2,3,5,6