本节说明 MATLAB 中将可复用逻辑封装为函数的方式。函数接收输入参数、在独立工作区中计算并返回输出;同一算法不必在脚本中重复书写。脚本直接在命令行工作区执行且无显式输入输出边界;函数则通过 function 行声明接口,便于在不同数据上反复调用。
函数文件的基本结构
函数通常保存在与函数名同名的 .m 文件中。下列 mymax.m 求五个数的最大值:
function maxval = mymax(n1, n2, n3, n4, n5)
% 计算五个数的最大值
maxval = n1;
if n2 > maxval, maxval = n2; end
if n3 > maxval, maxval = n3; end
if n4 > maxval, maxval = n4; end
if n5 > maxval, maxval = n5; end
end- 以
function关键字开头,列出输出名与输入参数。 maxval为输出;n1至n5为输入。function行下方的注释为帮助文本,在命令窗口执行help mymax时可显示。- 函数体以
end结束(与 R2016b 及以后版本的函数文件惯例一致)。
调用示例:
mymax(34, 78, 89, 23, 11)ans = 89多输入多输出
函数可声明多个输出。下列 quadratic.m 求一元二次方程的两个根:
function [x1, x2] = quadratic(a, b, c)
d = sqrt(b^2 - 4*a*c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end调用时用方括号接收多个输出:
[r1, r2] = quadratic(2, 4, -4)r1 = 0.7321
r2 = -2.7321子函数
一个 .m 文件中,第一个函数为主函数,供外部调用;其后可定义子函数,仅能被同一文件内的函数调用:
function [x1, x2] = quadratic2(a, b, c)
d = disc(a, b, c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end
function d = disc(a, b, c)
d = sqrt(b^2 - 4*a*c);
end工作区
函数内部的变量属于该函数的局部工作区,函数返回后随之销毁,命令行工作区无法直接访问。若须在多个函数间共享变量,可使用 global 声明;但会降低可读性与可维护性,宜谨慎使用。
自查
- 函数文件名与文件内主函数名是否必须一致?
- 只接收第一个输出而忽略其余输出时,应如何调用?
- 子函数能否被命令窗口直接调用?
本节说明了函数文件结构、多输入输出、子函数及局部工作区。下一节介绍匿名函数:一行表达式、函数句柄与作为参数传递。