Loading... # Matlab 函数的定义和应用 ## 函数文件的建立 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta?p=14 </div> 每个函数(下面介绍到的匿名函数除外),应当定义在一个独立的文件中。 函数文件的扩展名是 `.m` ,有以下三个途径建立函数文件: - 在 matlab 中 菜单 主页-新建脚本 - `edit` 命令 - 使用其他工具编辑 ## 函数的定义 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta/?p=19 </div> ``` function 输出形参表=函数名(输入形参表) ``` 1. 函数文件名可以和函数文件名一致,也可以不一致,若不一致,matlab会忽略函数名,而使用函数文件名。在大多数情况下我们应使函数名和函数文件名一致。 2. 形式参数之间用逗号分隔。 3. 若需要返回多个结果,可以使用矩阵。 4. 可使用 `return` 结束程序的运行。 一个例子:求半径为 `r` 的圆的周长和面积。 ```matlab function [s,p]=fcircle(r) s = pi * r * r; p = 2 * pi * r; ``` ## 函数调用 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta/?p=19 </div> ``` [输出实参表]=函数名(输入实参表) ``` 一个例子:调用 `fcircle` 函数 ```matlab [s,p]=fcircle(10) ``` 输出: ``` >> [s,p]=fcircle(10) s = 314.1593 p = 62.8319 ``` ## 匿名函数 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta/?p=19 </div> ```matlab 函数句柄变量=@(匿名函数输入参数)匿名函数表达式 函数句柄变量=@函数名 ``` 1. 输入参数用 `,` 分隔。 2. 函数表达式可以是一个标量,也可以是一个矩阵。 3. 用第二种方式相当于建立了函数的别名,如`mysin = @sin` 改写前面的例子,求半径为 `r` 的圆的周长和面积。 ```matlab f1=@(r)[pi*r*r,2*pi*r]; ``` 调用格式和调用普通函数的形式相同,如: ```matlab f1(10) ``` 输出: ``` >> f1=@(r)[pi*r*r,2*pi*r]; >> f1(10) ans = 314.1593 62.8319 ``` ## 函数递归调用 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta/?p=20 </div> matlab 中的递归调用和其他程序设计语言无本质区别。 一个递归调用的例子:求 `n!` ```matlab function result=fact(n) if n <= 1 result = 1; else result = fact(n-1)*n; end ``` ## 函数参数的可调性 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta/?p=21 </div> matlab 在函数作用域中预定义了两个变量: - `nargin` 输入实参的个数 - `nargout` 输出实参的个数 利用这两个变量,我们可以实现同一个函数实现多个功能: 例如这个例子:实现不超过3个数的累加: ```matlab function result=mysum(a,b,c) if nargin == 1 result = a; elseif nargin == 2 result = a + b else result = a + b + c ``` ## 变量的作用域与可见性 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta/?p=21 </div> - 局部变量 - 只在某个过程中(如某个函数中,当前工作区中)可见 - 局部变量是一个变量的默认状态 - 全局变量 - 多个过程共享的变量,发生在这个变量上的任何修改对其他过程来说都是可见的 - 使用 `global` 关键字声明全局变量,格式为 ``` global 变量名1 变量名2 ``` - 在使用全局变量之前都应该先声明,例如在工作区已经声明了一个全局变量,那么在函数中需要使用这个全局变量之前,也需要使用 `global` 关键词声明接下来会使用这样一个全局变量。 - 声明一个不存在全局变量时,这个变量会被自动初始化为空矩阵。 - 声明一个全局变量,且当前工作区已存同名变量时,当前工作区的变量会被覆盖,同时 matlab 会发出一个警告。 这里是一个使用全局变量的例子:用 `n` 来记录函数调用的次数 ```matlab function myfunc1() global n; n = n + 1; ``` 在命令行窗口中,可使用以下命令查看 `n` 的值 ```matlab global n; disp(n); ``` ## 变量的声明周期 <div class="tip inlineBlock info"> 相关资料 https://www.mathworks.com/help/releases/R2018a/matlab/ref/mlock.html </div> 在函数中定义的局部变量会随着函数运行结束而销毁,matlab 也提供有类似 C++ 的 `static` 关键词的静态存储特性,变量在程序的生命周期中常驻内存,并且只初始化一次,这个关键词是 `persistent`。 我们用 `persistent` 关键词改写上 面记录函数调用次数的函数 ```matlab function myfunc2() mlock persistent n if isempty(n) n = 0; end n = n+1; disp(n) end ``` 和上之前的例子不一样,这里的变量 `n` 是一个局部变量,只在 `myfunc2` 中可见。 注意到这里还使用到了一个命令 `mlock`,这个命令的作用的锁定在当前函数中声明的 `persistent` 变量,这样使用 `clear all` 就不会把销毁变量 `n`。如果我们需要解锁 `myfunc2` 中的变量,可以使用 `munlock('myfunc2')` 命令。 最后修改:2020 年 05 月 11 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏