Matlab程序设计基础

Download Report

Transcript Matlab程序设计基础

Matlab 程序设计基础
一、逻辑数据、关系运算、逻辑运算
二、程序控制语句
三、M函数
一、逻辑数据、关系运算、逻辑运算
1、逻辑类型的数据和函数
2、关系运算
3、逻辑运算
4、运算优先级
1、逻辑类型的数据和函数
逻辑类型的数据主要用于选择(判断)结构,在Matlab
中,也可用来作为数组元素的“逻辑索引”。用 1 表示逻辑“
真”(true),用 0 表示逻辑“假”(false)。
每个逻辑类型的数据在内存中占用1个字节。
(1) logical( )
(2) true( ) false( )
(3) all( ) any()
(4) is* 系列测试函数
(5) 逻辑索引
(1) logical( )
:
将数值型数据转换为逻辑型数据
L = logical(A)
输入A为实数数组,返回值L为一个与A
同维的逻辑数组,当A中的元素为非零元素时,L中对应的位
置返回逻辑1,否则返回逻辑0。
注意:A中的元素不能为复数或 NaN
format bank
A = eye(3)
L = logical(A)
M=L+0
A=
L=
1.00
0
0
0
1.00
0
0
0
1.00
1
0
0
0
1
0
0
0
1
逻辑型数据参与数值运算,即会转换为数值
型数据。故M就不是逻辑数组了,而是双精度数值数
组。
(2) ture( ) 和 false( ) :创建逻辑类型的数据
用ture( )和false( )函数可以创建逻辑类型的数据
true :
即 logical (1)
true(n) :
逻辑1组成的n×n二维数组
true(m, n) :逻辑1组成的m×n二维数组
true([m, n]) :与 true(m, n) 功能相同
true(size(A)) :与数组A维数相同的值为逻辑1数组
false 的用法与 true 相同
(3) all( ) 和 any( ) :
all(A)
返回逻辑类型数据
当A为一维数组时(忽略其中的NaN ),若其元素全部为真(非
0),则返回真,否则返回假。(返回一个逻辑数)
当A为二维数组时,若其一列上的所有元素全部为真(非0),
则对应列的位置返回真,否则返回假。(返回一个逻辑行数组)
当A为一维数组时(忽略其中的NaN ), 若其元素不全部为假
(0),则返回真,否则返回假。(返回一个逻辑数)
any(A)
当A为二维数组时,若其一列上的所有元素不全部为假(0),
则对应列的位置返回真,否则返回假。(返回一个逻辑行数组)
任何非 0 数都被看作是“逻辑真”,只有 0 才被认为是“逻辑
假”。
a= 0 1 1
A = [1,2,3;0,4,6]
a = all(A)
b= 1 1 1
b = any(A)
c= 0
c = all(a)
d = all(b)
d= 1
(4) is*
系列测试函数:
返回逻辑类型数据
isempty(x)
测试待测变量是否为空数组
isscalar(x)
测试待测变量是否为标量(1*1数组)
isvector(x)
测试待测变量是否为一维数组
isprime(x)
测试待测变量是否为素数
isfinite(x)
测试待测变量是否为有限值
isinf(x)
测试待测变量是否为无穷大
isnan(x)
测试待测变量是否为非数
islogical(x)
测试待测变量是否为逻辑类型
ischar(s)
测试待测变量是否为字符串类型
isletter(s)
测试待测变量是否为字母
isspace(s)
测试待测变量是否为空格
isequal(A,B)
测试待测变量A,B是否相等(认为NaN互不相等)
……
……
doc is 可以在matlab的help中查看到所有的测试函数
(5) 逻辑型数据用作 “ 逻辑索引 ”
A = 1:10
L = logical([0 1 0 1])
A(L)
逻辑索引:通过逻辑数组 L 中“逻
辑1”所在的位置,指出数组 A 中元
素的的位置,从而可以对A 数组中
的元素(子数组)进行访问或赋值。
L 的元素个数应等于或小于 A 的元素个数,一般情况下,
L 应是与 A 同维的逻辑数组
A = 80:100
s = 'ab-123-cd-456-efg';
L = isprime(A)
L = isletter(s);
P = A(L)
s(L) = '*';
disp(s)
2、关系运算
关系运算用于比较两个操作数的大小关系,并
返回逻辑1或者逻辑0。
(1)两个标量(双精度实数)之间的关系运算
关系运算符
举例
返回结果
小于
3<2
0
小于等于
3<=2
0
大于
3>2
1
>=
大于等于
3>=2
1
==
等于
3==2
0
~=
不等于
3~=2
1
<
<=
>
说明
(2)两个数值数组之间的关系运算
进行比较的两个数组必须维数相同,比较在两数组相同
位置上的元素间进行,返回一个由0和1组成的“逻辑数组” 。
1 2 
A

3
4


关系运算符
4 2
B

3
1


举例
返回结果
小于
A<B
[ 1, 0; 0, 0 ]
小于等于
A<=B
[ 1, 1; 1, 0 ]
大于
A>B
[ 0, 0; 0 ,1 ]
>=
大于等于
A>=B
[ 0, 1; 1, 1 ]
==
等于
A==B
[ 0, 1; 1, 0 ]
~=
不等于
A~=B
[ 1, 0; 0, 1 ]
<
<=
>
说明
(3)标量和数值数组之间的关系运算
标量可以与任何维数组进行比较。比较在此标量与数组
每个元素之间进行,因此比较结果与被比数组同维,返回一个
由0和1组成的“逻辑数组” 。
1 2
A

3
4


关系运算符
b2
举例
返回结果
小于
A<b
[ 1, 0; 0, 0 ]
小于等于
A<=b
[ 1, 1; 0, 0 ]
大于
A>b
[ 0, 0; 1 ,1 ]
>=
大于等于
A>=b
[ 0, 1; 1, 1 ]
==
等于
A==b
[ 0, 1; 0, 0 ]
~=
不等于
A~=b
[ 0, 1; 0, 0 ]
<
<=
>
说明
(4)字符数组的关系运算
字符数组的关系运算实际上用每个字符的内部编码进行
关系运算。
s1 = 'Matlab' , s2 = 'Matrix'
关系运算符
举例
返回结果
s1<s2
[ 0, 0, 0, 1, 1, 1 ]
s1<=100
[ 1, 1, 0, 0, 1, 1 ]
大于
s1>s2
[ 0, 0, 0, 0, 0, 0 ]
>=
大于等于
s1>='s'
[ 0, 0, 1, 0, 0, 0 ]
==
等于
s1==s2
[ 1, 1, 1, 0, 0, 0 ]
~=
不等于
s1~=s2
[ 0, 0, 0, 1, 1, 1 ]
<
<=
>
说明
小于
小于等于
(5)关系运算中的注意事项
比较两个数是否相等的关系运算符是“ == ”,单个的等
号“ = ” 是变量赋值符号。
不等于的关系运算符是“ ~= ”,不要与 C 语言的不等于
符号“ != ” 混淆。
比较两个浮点数是否相等时需要注意,由于浮点数的存
储时的误差的存在,在程序设计中要避免直接比较两个浮点数
是否相等,而是采用大于、小于的比较运算将待确定值限制在
一个满足需要的区间之内。
3<x<7这样的数学表达式必须用逻辑“与”运算才能正
确表示。
关系运算举例
已知二维数组 A =
100 109 118 127 136 145
103 112 121 130 139 148
106 115 124 133 142 151
试输出 A 中能被 7 整除的所有数
A = 100:3:151
A = reshape(A,3,6)
B = rem(A,7)
L = B==0
r = A(L)
B=
2
5
1
4
0
3
6
2
5
1
4
0
3
6
2
5
1
4
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
L=
0
0
0
r=
112
133
(6) find( ) 函数
ind = find(X) 找出数组X中的所有非零的元素的位置,并且在
向量ind中返回非零元素的线性索引(单下标)。如果X是一个行向
量,则ind也是一个行向量,否则,ind是一个列向量。如果X没有
非零元素或者是空数组,则ind为空数组。
ind = find(X, k) 或 ind = find(X, k, 'first') 返回数组X中所有非
零元素的前k个元素的索引值,k必须为正整数。
ind = find(X, k, ‘last’)
的索引值。
返回数组X中所有非零元素的后k个元素
[row,col] = find(X, ...) 返回矩阵 X 中非零元素的双下标索引,
行索引返回至 row,列索引返回至 col
[row,col,v] = find(X, ...) 返回 X 中非零元素组成的向量 v,以及
相应的行、列索引(双下标)。如果X是一个逻辑式,则v是一个
逻辑数组。输出v包含表达式X计算出的逻辑数组的非零值。
find( ) 函数举例
A = diag([3,5],1)
k = find(A)
[r,c,v] = find(A)
B = diag([3,5,7],1)
k = find(B>4)
[r,c,v] = find(B>4)
k=
r=
10
15
2
3
A=
0
0
0
k=
3
0
0
B=
0
0
0
0
c=
3
4
0
5
0
3
0
0
0
v=
B(find(B)) 的输出是什么?
B(find(B>4)) 的输出是什么?
0
5
0
0
1
1
r=
4
8
0
0
7
0
c=
1
2
v=
2
3
3
5
find()函数的输入参
数是这个逻辑数组
B > 4 的输出为:
0 0 0 0
0 0 1 0
0 0 0 1
0 0 0 0
3、逻辑运算
(1)逻辑运算的真值表
输入
A
B
与
A&B
或
A|B
非
~A
异或
xor(A,B)
0
0
0
0
1
0
0
1
0
1
1
1
1
0
0
1
0
1
1
1
1
1
0
0
(2)Element-Wise 逻辑运算
逻辑运算可以在标量与标量,数组与数组,标量与数组间进行
A = [0, 1, 2, 0, 3], B = [4, 5, 0, 0, 6], c = 7
逻辑运算
与
或
运算符
A&B
A|c
非
异或
~A
函数形式
and(A, B)
or(A, c)
结果
[0, 1, 0, 1, 1]
[1, 1, 1, 1, 1]
not(A)
xor(A, B)
[1, 0, 0, 1, 0]
[1, 0, 1, 0, 0]
在逻辑表达式中,作为输入的任何非 0 实数都被看作是
“逻辑真”,只有 0 才被认为是“逻辑假”。
标量(一个数)可以与任何维数组进行逻辑运算。运算在
标量与数组每个元素间进行。
当两个数组进行逻辑运算时,参与运算的数组必须维数相
同,运算在两数组相同位置上的元素间进行。
(3)Short-Circuit 逻辑运算
Short-Circuit 逻辑运算符有两个:&& 和 || 。在一些特
殊的情况下,Short-Circuit径逻辑运算符会减少一些逻辑判断
的操作。
A&B:先要计算两个操作数的结果,然后逻辑与
A&&B:当参与运算的第一个操作数为逻辑假时,直接返回假,
而不再去计算第二个操作数。(与C语言规则相同)
有些中文书上称 && 为 “短路与” 、“先决与”、“捷径
与” 。
&& 不能用于数组,即A,B不能是数组
当 A&B 放在 if 和 while 表达式中时, & 的处理方式与 && 相同
L1 = 0&sqrt(-1)
哪条语句会出错?
L2 = 0&&sqrt(-1)
L3 = [1, 2]&&[0,3]
A | B :先要计算两个操作数的结果,然后逻辑或
A || B :当参与运算的第一个操作数为逻辑真时,直接返回真,
而不再去计算第二个操作数。(与C语言规则相同)
有些中文书上称 || 为“短路或”、 “先决或”、“捷径或”。
|| 不能用于数组,即A,B不能是数组
当 A | B放在 if 和 while 表达式中时, | 的处理方式与 || 相同
L1 = 1|sqrt(-1)
哪条语句会出错?
L2 = 1||sqrt(-1)
L3 = [1, 2]||[0,3]
逻辑运算举例
100以内的哪些正整数满足:0.7 < sin(n) < 0.75 ?
n = 1:100
L1 = sin(n)>0.7
L2 = sin(n)<0.75
L = L1&L2
r = n(L)
4、运算优先级
优先次序
最高
运算符
括号 ( )
.’
转置 ’
正号 +
乘*
加+
幂^
负号 -
.*
.^
逻辑非 ~
点除 /
\
./
.\
<=
>
>=
减-
冒号运算 :
关系运算
&
|
&&
最低
||
<
==
~=
在书写表达式时,应尽量使用
括号明确各部运算的次序,尽可能减
少优先级混乱
二、程序控制语句
1、选择结构:if, switch
2、循环结构:for, while, continue, break
3、错误控制结构:try, catch
4、控制程序流的其他常用指令
5、计时函数
1、选择结构
选择结构也称为决策结构、分支结构或判断结构
(1) if - end 结构
(2) if - else - end 结构
(3) if - elseif - … - else - end 结构
(4) switch 构
(1) if - end 结构
if expression
statements
end
这是最简单,最
常用的选择结构。
expression 为条件表达式 , statements 为要执行
的语句。 expression的值为逻辑真(非0)时,statements
才会执行。
一般情况下,表达式 expression 都是标量,但也允许
为数组,此时只有数组元素都为逻辑真时,statements才被
执行。如果表达式为空数组,被认为是假。
若expression表达式是由多个表达式组成,MATLAB
尽可能少的检测这些子表达式的值。例如, expression为
A|B,当MATLAB检测到A为真时,它就认为表达式为真,而
不对B进行检测。(即Short-Circuit 逻辑运算)
(2) if - else – end 结构
若要在 expression 为 True和 False 两种条件下执
行不同的操作,可以使用如下格式的 if - else - end 结构:
if expression
statements 1
else
statements 2
end
(3) if - elseif - … - end 结构
当需要根据多个条件执行多个不同的操作时,可以采
用下面的选择结构,matlab 将从上到下检测各个表达式,执
行与所遇到的第一个为 True 的表达式相对应的命令集,
然后退出选择结构。
if expression1
statements1
elseif expression2
statements2
elseif expression3
statements3
……
else
statements
end
注意:
elseif 中间没有空格!
if 结构举例
输入数值数组:
输出字符数组:
规则
99
90 - 100
优
99_优
76
75 - 89
良
76_良
中
67_中
67
89
55
94
60 - 74
0 - 59
其它
差
无效成绩
89_良
55_差
94_优
87
87_良
65
65_中
44
44_差
107
107_无效成绩
-77
-77_无效成绩
a = [99;76;67;89;55;94;87;65;44;107;-77];
s = '';
for k = 1:length(a)
if a(k)>100
s = strvcat(s,[num2str(a(k)), '_无效成绩']);
elseif a(k)>=90
s = strvcat(s,[num2str(a(k)),'_优']);
elseif a(k)>=75
s = strvcat(s,[num2str(a(k)),'_良']);
elseif a(k)>=60
s = strvcat(s,[num2str(a(k)),'_中']);
elseif a(k)>=0
s = strvcat(s,[num2str(a(k)),'_差']);
else
s = strvcat(s,[num2str(a(k)),'_无效成绩']);
end
end
disp(s)
(4) switch 结构
switch expression
case expr1
statement1
case expr2
statement2
……
otherwise
statement
end
当遇到 switch 结构时,
MATLAB 将 expression
的值依次与各个 case 指令后
面的检测值进行比较:
若比较结果为假,则取下
一个检测值再比较;
若比较结果为真,则执行
相应的一组指令,然后跳出该
结构;
若所有比较结果都为假,
则执行 otherwise 后面的一组
指令。
注意:与C语言不同,每个case语句后不要跟break语句。
switch 结构举例(1)
输入学号:
规则
输出字符数组:
1530152
15301
师范1班
1530152_师范2班
1530367
15302
师范2班
1530367_师范3班
1530271
15303
师范3班
1530271_师范2班
1530483
15304
基地班
1530483_基地班
1540162
15401
光电子班
1540162_光电子班
1540177
其它
插班生
1540177_光电子班
1530386
1530386_师范3班
1530491
1530491_基地班
1530482
1530482_基地班
2110123
2110123_插班生
a = [1530152;1530367;1530271;1530483;1540162;...
1540177;1530386;1530491;1530482;2110123];
b = fix(a./100);
s = '';
for k = 1:length(a)
switch b(k)
case 15301
s = strvcat(s,[num2str(a(k)),'_师范1班']);
case 15302
s = strvcat(s,[num2str(a(k)),'_师范2班']);
case 15303
s = strvcat(s,[num2str(a(k)),'_师范3班']);
case 15304
s = strvcat(s,[num2str(a(k)),'_基地班']);
case 15401
s = strvcat(s,[num2str(a(k)),'_光电子班']);
otherwise
s = strvcat(s,[num2str(a(k)),'_插班生']);
end
end
disp(s)
switch 结构举例(2)
a = [99;76;67;89;55;94;87;65;4;107;-77];
score1 = num2cell(90:100);
case后的检测值可以是cell数组
score2 = num2cell(75:89);
{90,91,92, …}。此时,将表达式的值与
score3 = num2cell(60:74);
score4 = num2cell(0:59)
元胞数组的所有元素进行比较,如有某
s = '';
个元素与表达式的值相等,则结果为真。
for k = 1:length(a)
switch a(k)
case score1
s = strvcat(s,[num2str(a(k)),'_优']);
case score2
s = strvcat(s,[num2str(a(k)),'_良']);
case score3
s = strvcat(s,[num2str(a(k)),'_中']);
case score4
s = strvcat(s,[num2str(a(k)),'_差']);
otherwise
s = strvcat(s,[num2str(a(k)), '_无效成绩']);
end
end
disp(s)
2、循环结构
(1) for循环
(2) while循环
(3) continue , break
(1) for 循环结构
for循环根据用户设定的条件,对结构中的命令反复执行
固定次数的操作,一般用于已知循环次数的情形。for循环的一
般格式如下:
for x = array
statement (循环体)
end
x 为循环变量,数组 array 的列数决定 for 循环的次
数。每次循环,x 依次取数组 array 的一列
在 for 后面的表达式中的数组 array 可以是任何合法
的MATLAB数组。
Matlab中i,j是虚数单位,若程序中涉及复数运算,一
定不能使用i,j作为循环变量。
for 循环举例(1)
例:所谓水仙花数是一个3位数,其各位数字的立方和等于该数
本身。如:153 = 13 + 53 + 33 。请将所有的水仙花数输出至一
行数组,共有多少个水仙花数?
r=[];
for n = 100:999
a = fix(n/100);
b = fix(n/10) - a*10;
c = rem(n,10);
if n == a^3 + b^3 + c^3
r = [r,n];
end
end
disp(['这些数为水仙花数: ',num2str(r)]);
disp(['共有 ',num2str(numel(r)),' 个水仙花数']);
for 循环举例(2)
某质点的位移由x(t)和y(t)确定,试绘制其运动轨迹

 x  t   2 cos  20m t   cos  20n t 


 y  t   2sin  20m t   sin  20n t 
m
n
2
3
2
-3
3
5
-3
5
要求:
1、m、n分别取上表中的四个数值
2、绘制1秒内的运动轨迹,每隔0.001秒
取一个点;
3、四种情况的运动轨迹绘制在一个图形
窗口的四个坐标轴中,排成2行2列。
m = [2,2,3,-3];
n = [3,-3,5,5];
t = 0:0.001:1;
for k = 1:4
x = 2*cos(20*m(k)*pi.*t) + cos(20*n(k)*pi.*t);
y = 2*sin(20*m(k)*pi.*t) + sin(20*n(k)*pi.*t);
subplot(2,2,k)
plot(x,y)
end
(2) while 循环结构
while 循环一般用于不知道循环次数的情形。while 循
环的一般格式如下:
while expression (条件)
statement(循环体)
end
expression的值为逻辑真(非0),则执行循环
体,直到表达式值为假
一般情况下,表达式 expression 都是标量,但
MATLAB 允许它为数组,此时只有数组元素都为真时,循环
体才被执行。如果表达式为空数组,被认为是假
while 循环举例
例:一张纸厚 0.06 mm 且足够大,试问将纸对折多少次,其
厚度将超过10000 m?
h = 0.06e-3
n = 0;
while h < 1e4
n = n + 1;
h = 2*h;
end
disp(['对折 ',num2str(n),' 次其厚度将超过10000米'])
(3) continue , break
continue 和 break 一般与 if 语句配合使用
continue :退出本次循环,执行下一次循环
break :终止当前的while、for循环,跳至相应的end后面的语句
下面这段代码的输出是什么?
for k = 1:3
for m = 1:3
if m == 2
continue
end
disp([k,m])
end
end
这段代码的输出又是什么?
for k = 1:3
for m = 1:3
if m == 2
break
end
disp([k,m])
end
end
循环练习
1、找出所有这样的 4 位正整数,其各位数字的4次方的
和等于该数本身,例如:1634 = 14 + 64 + 34 + 44
输出所有的满足条件的数至一行数组,这样的数共有多少个?
2、猴子吃桃问题: 有一堆桃子不知数目,猴子第一天
吃掉一半,觉得不过瘾,又多吃了一个,第二天照此办理,吃
掉剩下桃子的一半另加一个,天天如此,到第十天早上,猴子
发现只剩一只桃子了,问这堆桃子原来有多少个?
3、求 Fibonacci 数组中第一个大于10000的元素。
Fibonacci 规则:
ak  2  ak 1  ak ,  k  1, 2,
 , 且a1  a2  1。
1,1,2,3,5,8,13,21,34,55,89,…
3、错误控制结构:try - catch - end
在程序设计中,有时候会遇到不能确定某段代码是否
会出现运行错误的情况。这时候可以使用错误控制结构。
程序运行时,首先尝试执行try和catch之间的代码段,
如果代码执行没有错误发生,则程序通过,不执行catch和
end之间的部分,而是继续执行end后面的代码。
一旦try和catch之间的代码执行发生错误,则立即转而
执行catch和end之间的部分,然后才继续执行end后的代码。
matlab提供了lasterr函数,可以获取出错的原因。
try
statement1
总被执行,正确则跳至end后
catch
statement2
statement1出错,才执行这里
end
随机引用单位阵的行,当“行下标”超出单位阵的最大
行数时,改为引用数组的最后一行。
clc
重复运行这段程序,每次会
clear all
产生不同的随机数。当随机数大于
A = eye(4);
4时,catch后的语句就会执行。
r = 10*rand(1);
r = fix(r);
try
disp(A(r,:));
disp(['这次显示的是数组第',num2str(r),'行元素。']);
catch
disp(A(end,:));
disp('try内的语句出错啦,改为显示数组A的最后一行元素。');
end
4、控制程序流的其他常用指令
(1) input ( )
(2) keyboard
(3) pause( ) / pause
(4) error( ) / lasterr
(5) warning / lastwarn
(6) return
键盘输入函数
键盘控制
暂停函数
错误信息
警告信息
程序终止语句
(1) input ( )
v = input(‘prompt’)
在屏幕上显示提示信息 prompt,并等待用户的键
盘输入。用户可以从键盘输入任意的matlab表达式,按回车键确认。
合法的输入将被赋值给变量v,直接回车的话,返回值为空数组[ ] 。
若输入不合法,matlab会显示错误信息,并继续在屏幕上显示提示信息并等
待用户的键盘输入。
这种方式下,输入[1,2;3,4],则返回二维数值数组并赋值给变量v。
输入字母a,会被认为是变量a。若确实要输入字符串,如abcd,则需要输
入’abcd’ (即字符必须用单引号括起来)。
v = input(‘prompt’,’s’)
使用这种方式的话,用户从键盘输入数据被认
为是字符,创建的变量 v 为字符型数据。输入数字1,认为是字符‘1’,输入
字母a,认为是字符‘a’
reply = 'No'
while ~isequal(reply,'Yes')
reply = input('输入Yes,不然很烦的。 ', 's');
end
(2) keyboard
keyboard
程序执行到keyboard语句时,会暂停,将“控
制权”交给键盘,此时命令提示符变为K >>,用户可以输入
各种matlab指令,仅当用户输入return并回车后,“控制权”
才交还给程序,并继续执行keyboard后面的语句。在调试程
序时用的比较多。
clc
clear all
keyboard
a=x+y
(3) pause
pause
pause(n)
pause on
pause off
使程序暂停,用户按下键盘上任意键后继续
使程序暂停n秒后,再继续执行
使后面的pause 语句起作用
使后面的pause语句不起作用
clc
clear all
x = 0:0.1:2*pi;
y = sin(x);
axis([-1,7,-1.2,1.2]);
hold on;
for k =1:length(x)-1
plot(x([k,k+1]),y([k,k+1]));
pause(0.1);
end
通过暂停实现简单的动画
(4) error( ) / lasterr
error(‘message’)
显示出错信息message,并终止程序
lasterr
显示最新的出错信息,并终止程序
clc
clear all
x=2
y=3
error('出错啦,程序终止,后面的语句不会执行的。')
z = x+y
(5) warning( ) / lastwarn
warning(‘message’)
显示警告信息message,程序继续运行
lastwarn
显示最新的警告信息,程序继续执行
clc
clear all
x=2
y=3
warning('警告一下,程序不会终止,后面的语句会继续执行。')
z=x+y
(6)程序终止语句:return
程序代码一般而按流程执行完毕正常退出,但当遇到
某些特殊情况,程序需要立即退出时,就可以用return提前终
止程序运行。return语句多用在Matlab的函数文件中。
return
1、结束所在函数或脚本的执行,返回调用函数或指令窗
2、结束keyboard模式 ( K >> )
for k = 1:3
if k == 2
disp(k)
return
end
disp(k)
end
for k = 1:3
if k == 2
disp(k)
end
disp(k)
end
这两段程序的输出分别是什么?
5、Matlab 的计时函数
tic, toc:秒表计时,tic 开始,toc 结束;
tic;
你的 Matlab 程序;
time = toc; % time即为程序运行所用的时间,单位为秒
clc
clear all
n = 1000;
A = rand(n,n);
B = rand(n,n);
tic
x = A*B;
t = toc
Matlab计算两个1000×1000的随机矩
阵相乘需要的时间
六、M 函数
•
•
•
•
•
•
•
•
•
1、M文件
2、M函数文件
3、局部变量和全局变量
4、M函数举例
5、M函数调用
6、子函数
7、递归函数
8、inline function
9、函数句柄
1、M 文件
Matlab 语言编写的程序称为 M 文件, M 文件以 .m 为扩展名。
M 文件根据调用方式的不同可以分为两类:
Script:脚本文件 ,不接受参数的输入和输出。M 脚本文件与
maltab工作区共享变量空间,每次只需要键入文件名即
可运行M脚本文件中的所有代码。
Function:函数文件 ,接受参数的输入和输出,M函数文件处
理输入参数传递的数据,并把处理结果作为函数输
出参数返回给输出参数。M函数文件具有独立的内
部变量空间。在调用函数M文件时,要指定输入参
数的实际取值,而且要指定接收输出结果的输出变
量。
2、M 函数文件
函数文件由 function 语句引导
function 输出形参列表 = 函数名(输入形参列表)
% 注释说明部分(可选)
函数体语句(必须)
 第一行为引导行,表示该 M文件是函数文件
 函数名的命名规则与变量名相同 ( 必须以字母开头 )
 当输出形参多于一个时,用方括号括起来
 函数必须是一个单独的 M文件
 函数文件名必须与函数名一致
 以百分号开始的语句为注释语句
3、局部变量和全局变量
 函数文件运行时,matlab会专门开辟一个临时工作区间,称
为函数工作区间。
 函数文件中的变量都是局部的,即一个函数文件中定义的变
量不能被另一个函数文件或其它 M 文件使用。
 当函数调用完毕后,该函数文件中定义的所有局部变量都将
被释放,即全部被清除。
 函数通过输入和输出参数与其它 M 文件进行数据传递。
 如果在M函数中,调用某个M脚本文件,那么该脚本文件运行
时产生的所有变量都存放于该函数空间中,而不是存放在基本
空间。
 定义全局变量是 M 文件间传递信息的一种手段。
 如果在若干个 M 文件中,都把某个变量定义为全局变量,
则这些函数将公共使用这一变量。所有函数都可以对它进行存
取和修改操作。
定义全局变量 x 和 y :
global x y
变量名列表中的各个变量用空格隔开,不能用逗号!
全局变量给函数间的数据传递带来了方便,但却破坏了
函数对变量的封装,降低了程序的可读性,因而在结构化程序
设计中,全局变量是不受欢迎的。特别是当程序较大,子程序
较多时,全局变量将个程序调试和维护带来不便,故不提倡使
用全局变量。
4、M 函数举例
1、在M文件编辑器里编
写、保存函数文件
2、将函数文件存盘为
一个具体的文件
3、在命令窗口或其它M
文件中调用、测试函数
5、函数调用
函数定义
function 输出实参列表 = 函数名(输入实参列表)
function y = myfirstfun(x)
形参
函数调用
输出实参列表 = 函数名(输入实参列表)
a = myfirstfun(0)
实参
M 函数练习 1
函数y  f  x 的定义如下:
 x2  x  6
 2
f ( x)   x  5 x  6
 x2  x 1

,
x  0且x  4
,
0  x  10 , x  2且x  3
,
其它
1 编写一个Matlab函数实现该函数,且要求函数能够
处理输入参数为一维、二维数组的情况,即要求:


f  xij 
  f  xij  
mn
mn
 2  编写一个脚本文件,绘制上面的函数在区间
10  x  10的图形。
M 函数练习 2
Matlab没有专门的函数执行多项式加法(减法)
如果两个多项式的阶次相同,其系数向量的长度相等,多
项式的加法就是将两个多项式向量直接相加(相减)。
当两个多项式的阶次不同时,其系数向量的长度也不同,
这时需要先将低阶多项式的系数向量前边补上足够的0,以便使
它和高阶多项式具有相同的长度,然后再执行加法(减法)运算。
请编写一个函数 p = polyadd(p1,p2)实现不同阶次多项式
的加法,并利用该函数完成下面的练习。
练习 :
已知:f  x   1.35  0.668 x  0.436 x 2  0.69552 x 3
g  x   2.3  0.453 x  2.342 x 3
求: f  x   g  x  , f  x   g  x 
M 函数练习 3
6、子函数
 函数文件中可以含有一个或多个子函数
 子函数由 function 语句引导
 主函数必须位于最前面,子函数出现的次序任意
 子函数只能被主函数和位于同一个函数文件中的其它子
函数调用
 除了用 global 定义的全局变量外,子函数中的变量都
是局部变量,子函数与主函数及其它子函数之间通过输入、
输出参数进行数据传递
 调用一个函数时,Matlab 会首先检查该函数是否为一个
子函数。
子函数举例
function [avg, med] = main_fun(x) % 主函数
n = length(x);
avg = sub_fun1(x, n);
med = sub_fun2(x, n);
function a = sub_fun1(x, n) % 子函数
a = sum(x)/n;
function m = sub_fun2(x, n) % 子函数
x = sort(x);
if rem(n, 2) == 1
m = x((n+1)/2);
else
m = (x(n/2)+x(n/2+1))/2;
end
7、递归函数
直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
例:阶乘函数
阶乘函数可递归地定义为:
n0
 1
n! 
n(n  1)! n  0
边界条件
递归方程
边界条件与递归方程是递归函数的二个要素,递归函数
只有具备了这两个要素,才能在有限次计算后得出结果。
例:在Matlab中用递归函数实现计算 n!
% 函数文件 jc.m
function f = jc(n)
if (n==0)
f = 1;
else
f = n*jc(n-1);
end
% main.m
% 计算 s=1!+2!+3!+4!+5!
%
s = 0;
for k = 1:5
s = s + jc(k);
end
disp(s)
练习:
Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,
称为Fibonacci数列。它可以递归地定义为:
0
n0


F ( n)  
1
n 1
F (n  1)  F (n  2) n  1

试用递归函数计算 F(n)
边界条件
递归方程
8、inline function(内联函数)
使用inline( )定义的函数不需要保存为独立的.m文件,常
用来定义一些形式较简单的的函数。
inline function的定义由一个matlab表达式组成,表达式中
可调用其他matlab函数,但不能调用inline function。
inline function只能返回一个变量。
funname = inline(expr)
函数由字符串 expr 确定
输入变量 由matlab 自动确定
g = inline('t^2')
f = inline('3*sin(2*x.^2)')
g=
Inline function:
g(t) = t^2
f=
Inline function:
f(x) = 3*sin(2*x.^2)
funname = inline(expr,arg1,arg2,...)
函数由字符串 expr 确定
输入变量为 arg1,arg2,… ;
funname = inline(expr,n)
函数由字符串 expr 确定
输入变量为x,P1, P2,…,Pn
g = inline('sin(alpha*x)','x','alpha')
g=
Inline function:
g(x,alpha) = sin(alpha*x)
f = inline('sin(P1*x+P2)',2)
f=
Inline function:
f(x,P1,P2) = sin(P1*x+P2)
若不指定输入变
量,matlab也可以自动
确定这些输入变量,但
变量的顺序可能与用户
要求的顺序不同。
inline function举例
clc
clear all
myfun = inline('sin(x.^0.6)')
x = 0:0.1:100
y = myfun(x);
plot(x,y)
优点:不需要将函数存盘为具体的文件。
inline function的应用
很多Matlab函数可以用 inline function作为输入参数。例
如quad()函数(使用Simpson算法求函数的数值积分)。它的
一种调用形式是:
quad(fun, a, b)
其中,输入参数 fun 就可以是 inline function ,a和b分别是被积
区间的上、下限。考虑以下积分:


0
x sin xdx
f = inline('x.*sin(x)','x')
y = quad(f,0,pi)
9、Function handle (函数句柄)
函数句柄(Function handle)是MATLAB的一种数据类型,保
存函数的路径、函数名等信息。函数句柄使得函数也可以成为
输入变量,并且能很方便的调用,提高函数的可用性和独立性。
handlef = @fname;
handlef = str2func(‘fname’)
这里的fname可以是当前Matlab中可以使用的任意函数。
例如:
mysin=@sin
此后mysin就和sin同样地使用, mysin(pi)和sin(pi)的含义相
同.
匿名函数
若函数句柄变量指向一个函数表达式,则称其为匿名函
数。其语法:
handle = @(arglist)anonymous_function
变量名 = @(输入参数列表)函数表达式
例如:
mysquare=@(x)x.*x
之后, 执行mysquare(变量名), 即可计算该变量的平方, 注意,
mysquare属性是函数句柄变量, 而不是这个表达式; 还有要注
意这个表达式不需要用单引号括起来。
函数句柄的应用
很多Matlab函数可以用函数句柄作为输入参数。例如
quad()函数(使用Simpson算法求函数的数值积分)。它的一
种调用形式是:
quad(fun, a, b)
其中,输入参数 fun 就可以是函数句柄 ,a和b分别是被积区间
的上、下限。考虑以下积分:


0
x cos xdx
方法1:使用匿名函数
方法2:先定义M函数,并存盘
function y = dfw(x)
y = x.*cos(x);
再定义函数句柄,并调用
f = @(x)x.*cos(x)
y = quad(f,0,pi)
f = @dfw
y = quad(f,0,pi)