本节说明 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 声明;但会降低可读性与可维护性,宜谨慎使用。

自查

  • 函数文件名与文件内主函数名是否必须一致?
  • 只接收第一个输出而忽略其余输出时,应如何调用?
  • 子函数能否被命令窗口直接调用?

本节说明了函数文件结构、多输入输出、子函数及局部工作区。下一节介绍匿名函数:一行表达式、函数句柄与作为参数传递。