脚本与函数
脚本
特点:
- 工作区所有变量保存在 base 工作区中,除非使用 clear 命令或关闭 matlab,否则将一直保存在 base 工作区
- 脚本不能返回输出变量,但创建的变量都保存在工作区中
函数
特点:
- 若 M 文件的第一个可执行语句为
function
,该文件为一函数文件 - 函数文件内定义的变量为局部变量,只在文件内部起作用,函数文件执行完毕后,内部变量将被清除
构成:
- 定义行:必须为文件第一行,
function
引导,指明是一个函数文件,并定义函数名、输入参数、输出参数 - H1 行:帮助文本第一行,函数定义下的第一个注释行,供
lookfor
查询使用 - 帮助文本:H1 行后,连续的注释行,起解释、查询的作用,以帮助用户建立自己的
help
在线查询信息 - 函数体:用于计算、输出等工作,其中语句可以是顺序、控制、循环语句,也可以是调用函数,还可以是交互式I/O、赋值、计算、注释、空行等
1 | function num=cal(n) |
说明:
- 函数定义名与文件名应一致,当两者不一致时,将忽视文件首行定义名,以保存文件名为准
- 函数文件名要满足变量命名规则,与变量命名不同的是,其不能超过 31 个字符
- 从文件结构来看,脚本文件与函数相比,只是少了一个函数声明,此外,两者语法与架构相同。
控制权
return 指令:当被调用指令执行完毕后,matlab 会自动将控制权转回主函数或命令窗口,若在被调用函数中插入 return 语句,可以强制 matlab 结束执行并将控制权让出
pause 指令:pause(a)
表示程序暂停 a 秒后继续执行,但有时候也存在这种情况,程序中只有 pause,并没有参数 a,这样的意思是程序暂停,按任意键程序继续执行
子函数
- 多个函数可以写在同一个函数文件中,其中,第一个函数为主函数,其他所有函数为子函数
- 在一个函数文件中,子函数只能被主函数调用
- 每个子函数的第一行为定义行
- 子函数顺序可以任意改变
- 子函数通过函数名来调用
- 同一个函数文件中,主函数、子函数的工作区的独立的
1 | function num=cal(n) |
匿名函数
- 不是函数文件,没有函数名,通过函数句柄调用
- 匿名函数只有表达式与参数
- 格式:
函数名=@(参数1,参数2,...)表达式
1 | fun=@(a,b)a*a+b*b; |
函数重载
可变数量参数
varargin
:可变数量输入参数元胞数组varargout
:可变数量输出参数元胞数组nargin
:在函数体内获得实际的输入变量nargout
:在函数体内获得实际的输出变量narginchk(n,m)
:在函数体内检查输入参数,当个数小于 n 或大于 m 时会报错
函数重载
是什么:
- 函数名相同,参数个数或参数类型不同
- 通过函数参数的不同,来处理不同的情况
在 matlab 中,严格重载是指输入变量数量相同但变量类型不同时的重载,具体实现过于繁琐,不再赘述。
以下实现是通过对变量的合理运用,来实现函数重载的功能,并非严格意义上的函数重载。
1 | function num=test1(varargin) % 输入为可变参数 |
跨空间变量传递与赋值
工作区空间
在 matlab 中,除基本工作区外,不同的脚本与函数是具有不同工作空间的。
在调用某个函数 fun
时,工作区的取值有两个:
base
:主调函数的工作区caller
:被调函数的工作区
跨空间变量传递
evalin(工作区,表达式)
- 当工作区为
base
,表达式计算eval(表达式)
时,从基本工作区获取变量值 - 当工作区为
caller
,表达式计算eval(表达式)
时,从主调函数基本工作区获取变量值
- 当工作区为
evalin(工作区,表达式1,表达式2)
:首先从当前所在的工作空间获取变量值,并用eval(表达式1)
来计算,若计算失败,则从工作区
指定的工作区来获取变量值,并用eval(表达式2)
来计算
跨空间变量赋值
assignin('工作区',y,x)
:将当前工作区中的变量 x
的值,赋给 工作区
中的指定变量 y