MATLAB?基础与编程入门
MATLAB 编程入门
2
本章概述
流程控制和数组操作
性能提高
函数结构语法
子函数
私有函数
嵌套的函数
变量和工作区
可视化调试和剖析
3
MATLAB路径
MATLAB路径:
MATLAB 搜索路径(包括 \toolbox目录)
路径缓存:
\toolbox下文件和位置的清单
在程序启动时建立,以提高运行速度
路径设置:
Path browser(命令 PATHTOOL)
path,addpath,rmpath
4
流程控制结构
逻辑控制:
if / elseif / else
switch / case / otherwise
循环体:
for
while
5
逻辑控制程序结构
条件语句的使用
MATLAB中的跳转 — 一旦条件为真,或条件匹配,则中断当前的顺序执行方式
涉及字符串操作时使用 switch-case语句比 elseif更有效
if I == J
A(I,J) = 2;
elseif abs(I-J) == 1
A(I,J) = -1;
else
A(I,J) = 0;
end
switch algorithm
case 'ode23'
str = '2nd/3rd order';
case {'ode15s','ode23s'}
str = 'stiff system';
otherwise
str = 'other algorithm';
end
>> if_examp
>> switch_examp
6
循环结构
类似其它编程语言
for-按指定循环次数重复循环体(基于索引)
While-重复循环体,直到逻辑条件返回值为 false
可以进行循环嵌套
I = 1; N = 10;
while I <= N
J = 1;
while J <= N
A(I,J) = 1/(I+J-1);
J = J+1;
end
I = I+1;
end
>> for_examp
>> while_examp
N = 10;
for I = 1:N
for J = 1:N
A(I,J) = 1/(I+J-1);
end
end
7
提高性能 — 向量化(省略了 for循环)
使用循环 (多数语言 ):
M = rand(5,10000); L = rand(5,10000);
W = rand(5,10000); H = rand(5,10000);
[rows,cols] = size(M);
for I = 1:rows
for J = 1:cols
Density(I,J) = M(I,J)/(L(I,J)*W(I,J)*H(I,J));
end
end
Density = M./(L.*W.*H);
>> array_vs_loops
使用数组操作 (MATLAB):
8
提高性能:内存预分配
两种做法产生相同的向量:
for I = 1:10000
not_pre_allo(I) = rand(1);
end
pre_allo = zeros(10000,1);
for I = 1:10000
pre_allo(I) = rand(1);
end
开始时预置变量,开辟连续的存储空间( 10000单元)
防止 MATLAB 在内存中寻找 10000个大小不同的内存块
>> pre_allocate
9
函数
MATLAB核心(内建)函数
sin,abs,exp,…
MATLAB提供的 m-文件函数
mean,std,…
用户创建的 m-文件函数
无论何时您想到什么好主意您都可以 ……
脚本和函数 m-文件的差异
结构语法
函数工作区,输入和输出
10
函数 M-文件的结构
function y = mymean(x)
%MYMEAN Average or mean value.
% For vectors,MYMEAN(x) returns the mean value.
% For matrices,MYMEAN(x) is a row vector
% containing the mean value of each column.
[m,n] = size(x);
if m == 1
m = n;
end
y = sum(x)/m;
关键字,function 函数名(与文件名相同 name,m)
输出参数 输入参数在线帮助
MATLAB
代码
>> output_value = mymean(input_value) 命令行语法
11
多个输入和输出参数
function [avg,stdev,r] = ourstats(x,tol)
% OURSTATS finds the "average","standard
% deviation",and "rank" of a matrix
[m,n] = size(x);
if m == 1
m = n;
end
avg = sum(x)/m;
stdev = sqrt(sum(x.^2)/m - avg.^2);
s = svd(x);
r = sum(s > tol);
多个输入参数 (,)
多个输出参数 [,]
>> [a,s,rank] = ourstats(1:99,0.1);
12
练习:函数 M-文件给出三个边长,判断它们是否能组成一个三角形。
编写一个函数,输入是 3个边长;输出是字符串,指出提供的边长是否能构成三角形。
注意,构成三角形的充要条件是任意两边之和大于第三边。
附加题,指出三角形是等边三角形还是等腰三角形。
提示,用,&”和,|”进行 AND 和 OR 运算。
13
解答:函数 M-文件
>> str_out = mytriangle(3,4,5)
function str=mytriangle(side1,side2,side3)
% This is a file that takes three sides and produces
% a string that states whether this is a triangle or not.
all_sides=[side1,side2,side3];
vals=sort(all_sides);
highest_val=vals(end);
add_smaller_sides=vals(1)+vals(2);
if add_smaller_sides>highest_val
str='This forms a valid triangle!';
% Start extra credit
if (side1==side2)&(side2==side3)
str='This is an equilateral triangle!';
14
解答:函数 M-文件(续)
% Start extra credit
if (side1==side2)&(side2==side3)
str='This is an equilateral triangle!';
elseif side1==side2|side2==side3|side1==side3
str='This is an isosceles triangle!';
end
% End extra credit
else
str='This does not form a valid triangle.';
End
>> str_out = mytriangle(3,4,5)
15
子函数
使用子函数可以在同一个 M文件中容纳更多的函数(模块化代码)
包含子函数的 M-文件名必须与第一个函数( 主函数 )相同
在函数只能在同一个 M-文件中被调用
每个子函数都有独立的工作区
16
示例:子函数
function [totalsum,average] = stats(input_vector)
% STATS - calculates cumulative total & average
totalsum = sum(input_vector);
average = ourmean(input_vector); %Call to subfunction
function y = ourmean(x)
% OURMEAN - calculates average
[m,n] = size(x);
if m == 1
m = n;
end
y = sum(x)/m;
>> [tsum,avg] = stats(rand(1,50))
主函数子函数
17
私有函数 (Private Functions)
只有位于父目录当中的函数才能够调用 Private子目录中的函数
private
子目录
18
嵌套的函数 (Nested Functions)
function T = tax(income)
adjusted_income = max(income - 6000,0);
T = compute_tax;
function t = compute_tax
t = 0.28*adjusted_income;
end
end
19
MATLAB的工作区和堆栈
MATLAB(或称为基本环境)的工作区:
供命令行和脚本文件变量使用。
函数工作区:
每个函数都有自己独立的工作区以容纳局部变量;
与函数工作区的通讯通过输入输出变量进行(促进了代码的结构
化并防止了命名冲突)
全局工作区:
全局变量可由多个工作区分享(但必须在所有相关的工作区中初始化)
20
变量的生命周期
function [A,B] = primary(x,y)
A = subfun1(x);
B = subfun2(y);
function v = subfun1(u)
v = rand(u,1);
function v = subfun2(u)
v = randn(u,1);
function T = tax(income)
adj_income =,..
max(income - 6000,0);
T = compute_tax;
function t = compute_tax
t = 0.28*adj_income;
end
end
不同的工作空间共享的工作空间
21
工作区间的通讯全局工作区函数工作区函数的输入和输出全局变量 MATLAB工作区在所有相关工作区中初始化全局变量,
>> global variable_name
在被其它工作区调用之前,必须要在其“源引”工作区中初始化

22
示例:使用全局变量
>> global myx
>> myx=10; >> global myx
>> myx >> whos global
>> whos >> whos
>> clear myx >> clear myx
>> myx=23; >> clear myx global
>> whos
>> myx
23
使用全局变量时应注意:
避免命名冲突(使用大写字母)
whos global
clear global
isglobal()
24
调用的优先级
1,变量
2,嵌套的函数 (Nested function)
3,子函数 (Subfunction)
4,私有函数 (Private function)
5,类的构造函数
6,重载的方法
7,当前路径下的文件
8,搜索路径上的文件
>> foo
1,Built-in files
2,MEX-files
3,MDL-files
4,P-files
5,M-files
25
可视化调试 —— 自动断点
>> [tsum,avg] = stats(rand(1,50))
设置断点清除断点步进单步继续退出调试选择工作区设置自动中断点
26
可视化调试 —— 条件断点设置自动中断点
27
示例:可视化调试
设置调试器,在错误发生时停止
然后运行,>> [tsum,avg] = stats_error(rand(1,50))
28
示例:可视化调试(续)
Editor/debugger 打开相关文件并确定出错的代码行当前工作区
(函数 )
当前代码行
29
示例:可视化调试(续)
调试模式出错信息访问函数的工作区
30
剖析 M-文件
判断 M-文件每一行代码耗费了多少计算时间
步骤:
打开 profiler
调用 M-文件
报告结果
关闭 profiler

在 Desktop的开始按钮打开 Profiler

>> profile on
>> <matlabcommand>
>> profile report
>> profile off
31
示例:用 Profiler工具剖析 M-文件
32
本章小结
流程控制和数组操作
性能提高
函数结构语法
子函数
私有函数
嵌套的函数
变量和工作区
可视化调试和剖析