一.MATLAB脚本(Script)
- 创建实时脚本程序(1种交互式MATLAB文档),将所有命令放在一起;这是1个包括一系列MATLAB命令的.m文件;无需编译,即可执行;从上到下依次执行
1.使用脚本
(1)打开MATLAB实时编辑器并创建一个空白实时脚本:HOME栏-New选项-Live Script选项
(2)切换到文本模式以添加说明:LIVE EDITOR栏-Text按钮
(3)运行代码:LIVE EDITOR栏-Run All按钮
- 代码由上到下依次执行
- 结果显示在右侧窗格中
(4)点击输出窗格中某结果,编辑窗格中会标识生成该结果的命令;反之亦然
(5)通过输出窗格中布局按钮改变布局
(6)将代码分节,每次可只运行一节中的代码:
1.LIVE EDITOR栏-Section Break按钮
2.%%...%%
(7)保存:LIVE EDITOR栏-Save选项
- 默认为MATLAB Live Scripts(.mlx),只能被其他安装了matlab的用户使用
- PDF(.pdf)/HTML(.html)可被任何人使用,即便未安装matlab
- MATLAB Code files(.m)只保存代码,不保存结果
2.注释:
%注释:
%...
选中-右键-Comment选项
%取消注释:
选中-右键-Uncomment选项
3.Debug:
单击行号右侧:设置/取消断点
F12:设置/取消断点
F10:单步执行,碰到function不会跳入
F11:单步执行,碰到function跳入函数内执行
Shift + F11:跳入function之后,通过该指令推出function
F5:执行相邻两次断点见的所有指令
Shift + F5:退出断点调试
4.智能缩进:选中(Ctrl+A为全选)-右键-Smart Indent选项
5.打开.m文件:
edit [<file1>,<file2>...]
#不加参数:打开名为Untitled.m的新文件;MATLAB不会自动保存该文件
#file1,file2...:打开指定文件
#如果不存在,MATLAB会询问是否要创建它
#file可包含部分路径/完整路径/相对路径/无路径
#如果file只包含部分路径/未包含路径,将在搜索路径中查找文件
#用户必须拥有该路径的写入权限才能创建file,否则,MATLAB将忽略该参数
#必须指定扩展名才能打开.mat和.mdl 文件
#不能直接编辑二进制文件(如.p 和.mex文件)
二.控制语句
1.决策分支(if语句)
%满足某条件,执行对应命令,否则执行else的命令
if <condition1>
<command1>
[elseif <condition2>
<command2>
else
<command3>]
end %表示1个结构化句块的结束
2.循环语句
(1)for循环:
%当variable在[start,end]时循环执行命令,否则继续执行之后代码
%每次循环variable自增increment,默认为1
%for循环包含单个end关键字,与if语句类似
for <variable> = <start>:[<increment>:]<end>
<command>
end
for n = 1 : 10
a(n) = 2^n;
end
disp(a)
%结果为2,4,8,16,32,64,128,256,512,1024
%由于increment跳过的值会自动补0
for n = 1 : 2 : 10
a(n) = 2^n
end
disp(a)
%结果为2,0,8,0,32,0,128,0,512,0
(2)预分配内存空间:
%没有预分配:
%每次赋值,MATLAB会找到1块新的内存空间,将原有数据复制过来
tic %用来保存当前时间
for ii = 1 : 2000
for jj = 1 : 2000
A(ii,jj) = ii + jj;
end
end
toc %用来记录程序完成时间
%结果:Elapsed time is 3.761215 seconds
%有预分配:
tic
A = zeros(2000,2000);
for ii = 1 : size(A,1)
for jj = 1 : size(A,2)
A(ii,jj) = ii + jj;
end
end
toc
%结果:Elapsed time is 1.483291 seconds
(3)while循环:
%满足条件时循环执行命令,否则跳出
while <condition>
<command>
end
(4)停止循环:
continue:停止本次循环,继续下1次循环
break:停止所有循环,继续执行之后的代码
3.switch语句:
%执行表达式expression的值对应的命令,否则执行otherwise的命令
switch <expression>
case <value1>
<command1>
[case <value2>
<command2>
otherwise
<command3>]
end
三.自定义函数
0.函数与脚本
1.格式:
function <y> = <func>(<[x,x2...]>)
[%<comment>]
<code>
[end]%表示该函数到此结束
%参数说明:
function:关键字,声明是1个函数
x:传入的参数
y:返回哪个变量
#这是1个私有变量,在函数外部不同名
#如果返回多个变量,y应为[y1,y2...]
comment:注释
code:功能性代码
2.实例:
function x = free_fall(x0,v0,t)
%用于计算自由落体运动的末位置
%x0:初始位置;v0:初速度;t:下落时间;x:末位置
x = x0 + v0 .* t + (9.8 * t .* t) / 2
%.*保证可以用于多维空间中的计算
end
3.关于end:
- 需要测试
用于表示函数到此结束,通常可以省略
但是如果嵌套函数,里层和外层都需要加
function a1
...
function b
...
end%需要加end
end%此时需要加end
function a2
...
end%这种情况下,也需要加end
...
function a3
...
end%可以不加end
function a4
...
end%可以不加end
4.内置变量:
(1)函数内部变量:
inputname:函数输入的变量名称
%语法:s = inputname(argNum)
%参数说明:
inputname:所有传入参数构成的向量
argNum:参数编号(第几个传入的参数)
s:该变量的变量名
function myfun(a,b)
s = inputname(1);
disp(['First calling variable is ''' s '''.'])
end
x = 5;
y = 3;
myfun(x,y)
%结果:First calling variable is 'x'.
myfun(5,3)
%结果:First calling variable is ''.
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mfilename:当前正在运行的代码的文件名
%从函数内部调用时,返回1个字符向量,包含发生函数调用的文件的名称
%从文件中调用时,返回该文件的名称
%从命令行调用时,返回空字符向量
p = mfilename[('fullpath','class')]
%参数说明:
fullpath:返回进行调用的文件的完整路径和名称,不包括扩展名
class:返回该方法的类,不包括前导的'@'
%如果从非方法中调用,则会生成空字符向量
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nargin:传入了几个参数
nargout:返回了几个参数
funtion [volume] = pillar(Do,Di,height)
if nargin == 2,
height = 1;%如果只传入2个参数,指定1个默认的height
end%if语句结束
volume = abs(Do.^2 - Di.^2) .* height * pi / 4
end%函数结束
(2)可变长参数:
function <varargout> = <func>(<varargin>)
%不确定要传入/出几个参数时使用
varargin:可变长输入参数列表
%使用小写字符指定varargin,将其作为最后1个输入参数附加在显式声明的输入项后
%是个1 * n的数组(n是显式声明的输入后收到的输入项数)
%如果函数在显式声明的输入后未收到任何输入,则varargin是空数组
varargout:可变长输出参数列表
%使用小写字符指定varargout,将其作为最后1个输出参数附加在显式声明的输出项后
%是个1 * n的数组(n是显式声明的输出结果后的输出项数)
function [s,varargout] = returnVariableNumOutputs(x)
nout = max(nargout,1) - 1;
s = size(x);
for k = 1:nout
varargout{k} = s(k);
end
end
A = rand(4,5,2);
[s,rows,cols] = returnVariableNumOutputs(A)
%结果:
s = 1×3
4 5 2
rows = 4
cols = 5
5.函数句柄(Function Handler)
(1)创建匿名函数(Anonymous Function):
%语法:
f = @(arglist) func;
f(arg)
%参数说明:
arglish:传入的参数的列表
func:函数的功能性代码
f:赋给哪个变量
arg:传入的参数值
%实例:
f = @(x) exp(-2 * x);
x = 0 : 0.1 : 2;
plot(x,f(x));
(2)将函数作为参数:
<func>(@<f>)
#参数说明:
func:指定要调用的函数
f:指定作为参数传入的函数
#f.mlx中:
function x=f()
x=100;
end
#ff.mlx中:
function y=ff(f)
y=f();
end
#命令行中:
>> ff(@f)
ans =
100