王国利信息科学与技术学院中山大学
http://human-robot.sysu.edu.cn
Matlab计算与仿真技术第八讲,Matlab编程 -II
http://human-robot.sysu.edu.cn/course
Matlab计算与仿真
第七讲回顾
Matlab编程 -II
- 函数初识
- 控制语句
- 函数变量第八讲提纲
Matlab计算与仿真第七讲回顾
程序的概念与结构
- 程序,数据结构 +算法
- 结构,顺序 /选择 /循环
编程的环境和工具
- m 文件编辑器
m 文件及函数
- m文件,脚本文件 /函数文件
- 函数,主函数 /子函数 /…
Matlab计算与仿真
Matlab编程 (续 )
- m-函数及子函数实例
1,function [mean,stdev] = stat(x) % 主函数定义
2,% STAT Interesting statistics,
3,n = length(x); % 数据个数查询
4,mean = avg(x,n); % 子函数调用
5,stdev = sqrt(sum((x-avg(x,n)).^2)/n);
6,%-------------------------
7,function mean = avg(x,n) % 子函数定义
8,%AVG subfunction
9,mean = sum(x)/n; %内嵌函数调用
Matlab计算与仿真
Matlab编程 (续 )
- 函数申明与定义
1,function [mean,stdev] = stat(x)
↑ ↑ ↑
关键词 输出 = (子 )函数名 (输入 )
↓ ↓ ↓
7,function mean = avg(x,n)
- 子函数调用
4,mean = avg(x,n);
Matlab计算与仿真
Matlab编程 (续 )
- 函数的输入输出
twosum.m — two inputs,no output
threesum.m — three inputs,one output
addmult.m — two inputs,two outputs
----------------------------------------------
1,function twosum(x,y)
2,% twosum Add two matrices
3,% and print the result
4,x+y
Matlab计算与仿真
Matlab编程 (续 )
1,function s = threesum(x,y,z)
2,% threesum Add three variables
3,% and return the result
4,s = x+y+z;
---------------------------------------------
1,function [s,p] = addmult(x,y)
2,% addmult Compute sum and product
3,% of two matrices
4,s = x+y;
5,p = x*y;
Matlab计算与仿真
Matlab编程 (续 )
twosum的结果
>> twosum(2,2)
ans =
4
>> x = [1 2]; y = [3 4];
>> twosum(x,y)
ans =
4 6
>> A = [1 2; 3 4];
>> B = [5 6; 7 8];
>> twosum(A,B);
ans =
6 8
10 12
>> twosum(’one’,’two’) % 将字符串转换成整数组
ans =
227 229 212
Matlab计算与仿真
twosum的结果 (续 )
>> clear
>> x = 4; y = -2;
>> twosum(1,2)
ans =
3
>> x+y
ans =
2
Matlab编程 (续 )
>> disp([x y])
4 -2
>> who
Your variables are:
ans x y
% 注意,x,y 没有改变
Matlab计算与仿真
- threesum运行结果
>> a = threesum(1,2,3)
a =
6
>> threesum(4,5,6)
ans =
15
>> b= threesum(7,8,9);
注,b的值为 24
Matlab编程 (续 )
Matlab计算与仿真
- addmult运行结果
>> [a,b] = addmult(3,2)
a =
5
b =
6
>> addmult(3,2)
ans =
5
% 缺省只返回第一个输出分量
Matlab编程 (续 )
Matlab计算与仿真
- 函数嵌套
function varScope1
x = 5;
nestfun1
function nestfun1
nestfun2
function nestfun2
x = x + 1
end
end
end
Matlab编程 (续 )
Matlab计算与仿真
- 函数嵌套 (续 )
function varScope2
x=[];
nestfun1
nestfun2
function nestfun1
x = 5;
end
function nestfun2
x = x + 1
end
end
% 必须在主程序中申明 x,否则出错
Matlab编程 (续 )
Matlab计算与仿真
Matlab编程 (续 )
程序控制语句
- 选择结构依据条件选择执行程序指令或 模块
if 语句 % 条件选择关键词,if,else,和 elseif
基本格式,
if logical_expression
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
if 语句一般形式
if logical_expression
block of statements
elseif logical_expression
block of statements
… …
else
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
if 语句实例
if a < 0
disp(’a is negative’);
end
if x < 0
error(’x is negative; sqrt(x) is imaginary’);
else
r = sqrt(x);
end
Matlab计算与仿真
Matlab编程 (续 )
if 语句实例 (续 )
if x > 0
disp(’x is positive’);
elseif x < 0
disp(’x is negative’);
else
disp(’x is exactly zero’);
end
Matlab计算与仿真
Matlab编程 (续 )
switch 语句一般形式
switch expression
case value1,
block of statements
case value2,
block of statements
...
otherwise,
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
switch 语句实例
color = ’...’; % color is a string
switch color
case ’red’
disp(’Color is Red’);
case ’blue’
disp(’Color is Blue’);
case ’green’
disp(’Color is Green’);
otherwise
disp(’Color is not RGB’);
end
Matlab计算与仿真
Matlab编程 (续 )
- 循环结构根据条件重复执行程序指令或模块
for 语句 % 计数循环一般形式
for index = expression
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
for 语句实例
x = 1:5; % create a row vector
sumx = 0; % initialize the sum
for k = 1,length(x)
sumx = sumx + x(k);
end
for x = 0:pi/15:pi
fprintf(’%8.2f %8.5f\n’,x,sin(x));
end
Matlab计算与仿真
Matlab编程 (续 )
while 语句一般形式
while expression
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
while 语句实例,newton法计算
while abs(rold-r) > delta
rold = r;
r = 0.5*(rold + x/rold);
end
1
2n e w o ld o ld
x
rr
r
x
Matlab计算与仿真
Matlab编程 (续 )
while 语句实例,循环中断控制
x = rand(1,10);
k = 1;
while k<=10
if x(k)>0.8
break
end
k = k + 1;
end
Matlab计算与仿真
Matlab编程 (续 )
while 语句实例,函数返回控制
x = rand(1,10);
k = 1;
while k<=10
if x(k)>0.8
return
end
k = k + 1;
end
Matlab计算与仿真
- 关于函数变量输入 (输出 )变量查询函数,nargin(nargout)
功能,返回函数的输入 (输出 )个数应用,根据变量个数,选取模块执行
function c = testarg1(a,b)
if (nargin == 1)
c = a,^ 2;
elseif (nargin == 2)
c = a * b;
end
Matlab编程 (续 )
Matlab计算与仿真
Matlab编程 (续 )
- 变量的传递输入 (输出 )变量查询函数,varargin(varargout)
功能,返回由函数的输入 (输出 )变量的元胞数组元胞,Matlab的数据类型,由 { }标识
{ } 中可以是算术 /逻辑 /字符 /结构数据类型,例如
>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
>> A(1,2) = {'Anne Smith‘};
>> A(2,1) = {3+7i};
>> A(2,2) = {-pi:pi/10:pi};
Matlab计算与仿真
Matlab编程 (续 )
- 变量的传递 (续 )
注意,元胞数组的引用,{ }
function testvar(varargin)
for k = 1:length(varargin)
x(k) = varargin{k}(1); % Cell array indexing
y(k) = varargin{k}(2);
end
xmin = min(0,min(x));
ymin = min(0,min(y));
axis([xmin fix(max(x))+3 ymin fix(max(y))+3])
plot(x,y)
Matlab计算与仿真
Matlab编程 (续 )
- 函数句柄定义,指向函数的 Matlab值,基本格式
fhandle=@functionname
fhandle可以作为变量传递功能,用于函数的创建和访问 (运算 )
>> sqr = @(x) x.^2 % 匿名函数
>> trigFun = {@sin,@cos,@tan}
>> plot(trigFun{2}(-pi:0.01:pi))
Matlab计算与仿真
Matlab编程 (续 )
函数句柄的引用格式
fhandle(arg1,arg2,...,argn)
实例,fhandle指向 函数的曲线绘制
function x = plotFHandle(fhandle,data)
plot(data,fhandle(data))
引用,绘制 sin函数的曲线
>> plotFHandle(@sin,-pi:0.01:pi)
Matlab计算与仿真
Matlab编程 (续 )
函数句柄与匿名函数创建匿名函数
fhandle = @(arglist) expr
创建实例
>> sumxy = @(x,y) (x + y)
应用操作
>> sumxy(5,7)
Matlab计算与仿真匿名函数元胞组实例
>> A = {@(x)x.^2,@(y)y+10,(x,y)x.^2+y+10}
A =
[@(x)x.^2] [@(y)y+10] [@(x,y)x.^2+y+10]
>> A{1}(4) + A{2}(7)
ans =
33
>> A{3}(4,7)
ans =
33
Matlab编程 (续 )
Matlab计算与仿真参数化的匿名函数
>> a = 1.3; b =,2; c = 30;
>> parabola = @(x) a*x.^2 + b*x + c;
>> fplot(parabola,[-25 25])
% fplot(@(x) a*x.^2 + b*x + c,[-25 25])
>> a = -3.9; b = 52; c = 0;
>> fplot(parabola,[-25 25])
提示,fplot 绘制句柄指向函数的图形
Matlab编程 (续 )
Matlab计算与仿真
Matlab编程 (续 )
多重匿名函数的使用问题,计算提示,quad 是 matlab 缺省的积分计算函数回忆,>> lookfor quad
>> g = @(c) (quad(@(x) (x.^2 + c*x + 1),…
0,1));
>> g(2)
1 20( ) 1 dg c x c x x
(2)g
Matlab计算与仿真第九讲预告,Matlab编程 -III
( 2008年 04月 23日)
结束语
http://human-robot.sysu.edu.cn
Matlab计算与仿真技术第八讲,Matlab编程 -II
http://human-robot.sysu.edu.cn/course
Matlab计算与仿真
第七讲回顾
Matlab编程 -II
- 函数初识
- 控制语句
- 函数变量第八讲提纲
Matlab计算与仿真第七讲回顾
程序的概念与结构
- 程序,数据结构 +算法
- 结构,顺序 /选择 /循环
编程的环境和工具
- m 文件编辑器
m 文件及函数
- m文件,脚本文件 /函数文件
- 函数,主函数 /子函数 /…
Matlab计算与仿真
Matlab编程 (续 )
- m-函数及子函数实例
1,function [mean,stdev] = stat(x) % 主函数定义
2,% STAT Interesting statistics,
3,n = length(x); % 数据个数查询
4,mean = avg(x,n); % 子函数调用
5,stdev = sqrt(sum((x-avg(x,n)).^2)/n);
6,%-------------------------
7,function mean = avg(x,n) % 子函数定义
8,%AVG subfunction
9,mean = sum(x)/n; %内嵌函数调用
Matlab计算与仿真
Matlab编程 (续 )
- 函数申明与定义
1,function [mean,stdev] = stat(x)
↑ ↑ ↑
关键词 输出 = (子 )函数名 (输入 )
↓ ↓ ↓
7,function mean = avg(x,n)
- 子函数调用
4,mean = avg(x,n);
Matlab计算与仿真
Matlab编程 (续 )
- 函数的输入输出
twosum.m — two inputs,no output
threesum.m — three inputs,one output
addmult.m — two inputs,two outputs
----------------------------------------------
1,function twosum(x,y)
2,% twosum Add two matrices
3,% and print the result
4,x+y
Matlab计算与仿真
Matlab编程 (续 )
1,function s = threesum(x,y,z)
2,% threesum Add three variables
3,% and return the result
4,s = x+y+z;
---------------------------------------------
1,function [s,p] = addmult(x,y)
2,% addmult Compute sum and product
3,% of two matrices
4,s = x+y;
5,p = x*y;
Matlab计算与仿真
Matlab编程 (续 )
twosum的结果
>> twosum(2,2)
ans =
4
>> x = [1 2]; y = [3 4];
>> twosum(x,y)
ans =
4 6
>> A = [1 2; 3 4];
>> B = [5 6; 7 8];
>> twosum(A,B);
ans =
6 8
10 12
>> twosum(’one’,’two’) % 将字符串转换成整数组
ans =
227 229 212
Matlab计算与仿真
twosum的结果 (续 )
>> clear
>> x = 4; y = -2;
>> twosum(1,2)
ans =
3
>> x+y
ans =
2
Matlab编程 (续 )
>> disp([x y])
4 -2
>> who
Your variables are:
ans x y
% 注意,x,y 没有改变
Matlab计算与仿真
- threesum运行结果
>> a = threesum(1,2,3)
a =
6
>> threesum(4,5,6)
ans =
15
>> b= threesum(7,8,9);
注,b的值为 24
Matlab编程 (续 )
Matlab计算与仿真
- addmult运行结果
>> [a,b] = addmult(3,2)
a =
5
b =
6
>> addmult(3,2)
ans =
5
% 缺省只返回第一个输出分量
Matlab编程 (续 )
Matlab计算与仿真
- 函数嵌套
function varScope1
x = 5;
nestfun1
function nestfun1
nestfun2
function nestfun2
x = x + 1
end
end
end
Matlab编程 (续 )
Matlab计算与仿真
- 函数嵌套 (续 )
function varScope2
x=[];
nestfun1
nestfun2
function nestfun1
x = 5;
end
function nestfun2
x = x + 1
end
end
% 必须在主程序中申明 x,否则出错
Matlab编程 (续 )
Matlab计算与仿真
Matlab编程 (续 )
程序控制语句
- 选择结构依据条件选择执行程序指令或 模块
if 语句 % 条件选择关键词,if,else,和 elseif
基本格式,
if logical_expression
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
if 语句一般形式
if logical_expression
block of statements
elseif logical_expression
block of statements
… …
else
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
if 语句实例
if a < 0
disp(’a is negative’);
end
if x < 0
error(’x is negative; sqrt(x) is imaginary’);
else
r = sqrt(x);
end
Matlab计算与仿真
Matlab编程 (续 )
if 语句实例 (续 )
if x > 0
disp(’x is positive’);
elseif x < 0
disp(’x is negative’);
else
disp(’x is exactly zero’);
end
Matlab计算与仿真
Matlab编程 (续 )
switch 语句一般形式
switch expression
case value1,
block of statements
case value2,
block of statements
...
otherwise,
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
switch 语句实例
color = ’...’; % color is a string
switch color
case ’red’
disp(’Color is Red’);
case ’blue’
disp(’Color is Blue’);
case ’green’
disp(’Color is Green’);
otherwise
disp(’Color is not RGB’);
end
Matlab计算与仿真
Matlab编程 (续 )
- 循环结构根据条件重复执行程序指令或模块
for 语句 % 计数循环一般形式
for index = expression
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
for 语句实例
x = 1:5; % create a row vector
sumx = 0; % initialize the sum
for k = 1,length(x)
sumx = sumx + x(k);
end
for x = 0:pi/15:pi
fprintf(’%8.2f %8.5f\n’,x,sin(x));
end
Matlab计算与仿真
Matlab编程 (续 )
while 语句一般形式
while expression
block of statements
end
Matlab计算与仿真
Matlab编程 (续 )
while 语句实例,newton法计算
while abs(rold-r) > delta
rold = r;
r = 0.5*(rold + x/rold);
end
1
2n e w o ld o ld
x
rr
r
x
Matlab计算与仿真
Matlab编程 (续 )
while 语句实例,循环中断控制
x = rand(1,10);
k = 1;
while k<=10
if x(k)>0.8
break
end
k = k + 1;
end
Matlab计算与仿真
Matlab编程 (续 )
while 语句实例,函数返回控制
x = rand(1,10);
k = 1;
while k<=10
if x(k)>0.8
return
end
k = k + 1;
end
Matlab计算与仿真
- 关于函数变量输入 (输出 )变量查询函数,nargin(nargout)
功能,返回函数的输入 (输出 )个数应用,根据变量个数,选取模块执行
function c = testarg1(a,b)
if (nargin == 1)
c = a,^ 2;
elseif (nargin == 2)
c = a * b;
end
Matlab编程 (续 )
Matlab计算与仿真
Matlab编程 (续 )
- 变量的传递输入 (输出 )变量查询函数,varargin(varargout)
功能,返回由函数的输入 (输出 )变量的元胞数组元胞,Matlab的数据类型,由 { }标识
{ } 中可以是算术 /逻辑 /字符 /结构数据类型,例如
>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
>> A(1,2) = {'Anne Smith‘};
>> A(2,1) = {3+7i};
>> A(2,2) = {-pi:pi/10:pi};
Matlab计算与仿真
Matlab编程 (续 )
- 变量的传递 (续 )
注意,元胞数组的引用,{ }
function testvar(varargin)
for k = 1:length(varargin)
x(k) = varargin{k}(1); % Cell array indexing
y(k) = varargin{k}(2);
end
xmin = min(0,min(x));
ymin = min(0,min(y));
axis([xmin fix(max(x))+3 ymin fix(max(y))+3])
plot(x,y)
Matlab计算与仿真
Matlab编程 (续 )
- 函数句柄定义,指向函数的 Matlab值,基本格式
fhandle=@functionname
fhandle可以作为变量传递功能,用于函数的创建和访问 (运算 )
>> sqr = @(x) x.^2 % 匿名函数
>> trigFun = {@sin,@cos,@tan}
>> plot(trigFun{2}(-pi:0.01:pi))
Matlab计算与仿真
Matlab编程 (续 )
函数句柄的引用格式
fhandle(arg1,arg2,...,argn)
实例,fhandle指向 函数的曲线绘制
function x = plotFHandle(fhandle,data)
plot(data,fhandle(data))
引用,绘制 sin函数的曲线
>> plotFHandle(@sin,-pi:0.01:pi)
Matlab计算与仿真
Matlab编程 (续 )
函数句柄与匿名函数创建匿名函数
fhandle = @(arglist) expr
创建实例
>> sumxy = @(x,y) (x + y)
应用操作
>> sumxy(5,7)
Matlab计算与仿真匿名函数元胞组实例
>> A = {@(x)x.^2,@(y)y+10,(x,y)x.^2+y+10}
A =
[@(x)x.^2] [@(y)y+10] [@(x,y)x.^2+y+10]
>> A{1}(4) + A{2}(7)
ans =
33
>> A{3}(4,7)
ans =
33
Matlab编程 (续 )
Matlab计算与仿真参数化的匿名函数
>> a = 1.3; b =,2; c = 30;
>> parabola = @(x) a*x.^2 + b*x + c;
>> fplot(parabola,[-25 25])
% fplot(@(x) a*x.^2 + b*x + c,[-25 25])
>> a = -3.9; b = 52; c = 0;
>> fplot(parabola,[-25 25])
提示,fplot 绘制句柄指向函数的图形
Matlab编程 (续 )
Matlab计算与仿真
Matlab编程 (续 )
多重匿名函数的使用问题,计算提示,quad 是 matlab 缺省的积分计算函数回忆,>> lookfor quad
>> g = @(c) (quad(@(x) (x.^2 + c*x + 1),…
0,1));
>> g(2)
1 20( ) 1 dg c x c x x
(2)g
Matlab计算与仿真第九讲预告,Matlab编程 -III
( 2008年 04月 23日)
结束语