Alex_McAvoy

想要成为渔夫的猎手

Matlab 函数

脚本与函数

脚本

特点:

  • 工作区所有变量保存在 base 工作区中,除非使用 clear 命令或关闭 matlab,否则将一直保存在 base 工作区
  • 脚本不能返回输出变量,但创建的变量都保存在工作区中

函数

特点:

  • 若 M 文件的第一个可执行语句为 function,该文件为一函数文件
  • 函数文件内定义的变量为局部变量,只在文件内部起作用,函数文件执行完毕后,内部变量将被清除

构成:

  • 定义行:必须为文件第一行,function 引导,指明是一个函数文件,并定义函数名、输入参数、输出参数
  • H1 行:帮助文本第一行,函数定义下的第一个注释行,供 lookfor 查询使用
  • 帮助文本:H1 行后,连续的注释行,起解释、查询的作用,以帮助用户建立自己的 help 在线查询信息
  • 函数体:用于计算、输出等工作,其中语句可以是顺序、控制、循环语句,也可以是调用函数,还可以是交互式I/O、赋值、计算、注释、空行等
1
2
3
4
5
6
function num=cal(n)
if n>10
num=n*10;
else
num=n;
end

说明:

  • 函数定义名与文件名应一致,当两者不一致时,将忽视文件首行定义名,以保存文件名为准
  • 函数文件名要满足变量命名规则,与变量命名不同的是,其不能超过 31 个字符
  • 从文件结构来看,脚本文件与函数相比,只是少了一个函数声明,此外,两者语法与架构相同。

控制权

return 指令:当被调用指令执行完毕后,matlab 会自动将控制权转回主函数或命令窗口,若在被调用函数中插入 return 语句,可以强制 matlab 结束执行并将控制权让出

pause 指令:pause(a) 表示程序暂停 a 秒后继续执行,但有时候也存在这种情况,程序中只有 pause,并没有参数 a,这样的意思是程序暂停,按任意键程序继续执行

子函数

  • 多个函数可以写在同一个函数文件中,其中,第一个函数为主函数,其他所有函数为子函数
  • 在一个函数文件中,子函数只能被主函数调用
  • 每个子函数的第一行为定义行
  • 子函数顺序可以任意改变
  • 子函数通过函数名来调用
  • 同一个函数文件中,主函数、子函数的工作区的独立的
1
2
3
4
5
6
7
8
9
10
11
12
function num=cal(n)
if n>10
num=sub_fun1(n);
else
num=sub_fun2(n);
end

function temp1=sub_fun1(n)
temp1=n*n;

function temp2=sub_fun2(n)
temp2=n+n;

匿名函数

  • 不是函数文件,没有函数名,通过函数句柄调用
  • 匿名函数只有表达式与参数
  • 格式:函数名=@(参数1,参数2,...)表达式
1
2
3
4
fun=@(a,b)a*a+b*b;
x=1;
y=2;
disp(fun(x,y));

函数重载

可变数量参数

  • varargin:可变数量输入参数元胞数组
  • varargout:可变数量输出参数元胞数组
  • nargin:在函数体内获得实际的输入变量
  • nargout:在函数体内获得实际的输出变量
  • narginchk(n,m):在函数体内检查输入参数,当个数小于 n 或大于 m 时会报错

函数重载

是什么:

  • 函数名相同,参数个数或参数类型不同
  • 通过函数参数的不同,来处理不同的情况

在 matlab 中,严格重载是指输入变量数量相同但变量类型不同时的重载,具体实现过于繁琐,不再赘述。

以下实现是通过对变量的合理运用,来实现函数重载的功能,并非严格意义上的函数重载。

1
2
3
4
5
6
7
8
9
10
11
12
function num=test1(varargin) % 输入为可变参数
narginchk(2,3); % 检测参数个数
if nargin==2 % 如果参数个数为 2
a=varargin{1};
b=varargin{2};
num=max([a,b]);
elseif nargin==3 % 如果参数个数为 3
a=varargin{1};
b=varargin{2};
c=varargin{3};
num=max([a,b,c]);
end

跨空间变量传递与赋值

工作区空间

在 matlab 中,除基本工作区外,不同的脚本与函数是具有不同工作空间的。

在调用某个函数 fun 时,工作区的取值有两个:

  • base:主调函数的工作区
  • caller:被调函数的工作区

跨空间变量传递

  • evalin(工作区,表达式)
    • 当工作区为 base,表达式计算 eval(表达式) 时,从基本工作区获取变量值
    • 当工作区为 caller,表达式计算 eval(表达式) 时,从主调函数基本工作区获取变量值
  • evalin(工作区,表达式1,表达式2):首先从当前所在的工作空间获取变量值,并用 eval(表达式1) 来计算,若计算失败,则从工作区指定的工作区来获取变量值,并用 eval(表达式2) 来计算

跨空间变量赋值

assignin('工作区',y,x):将当前工作区中的变量 x 的值,赋给 工作区 中的指定变量 y

感谢您对我的支持,让我继续努力分享有用的技术与知识点!