MATLAB 结构化程式与自定义函数

一.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值