MATLAB函数把一段可复用的逻辑打包成独立单元,接收输入、算出结果再返回。同一套求最大值的 if,不必每处重写一遍。

函数文件的基本结构

函数通常写在独立的 .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 是输出,n1n5 是输入。
  • function 行下面的注释是帮助文本,命令行输入 help mymax 会显示出来。
  • end 收尾。

调用:

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 声明全局变量,但尽量少用,可读性会变差。

延伸思考

脚本没有输入输出边界,直接读写命令行工作区。函数有局部空间,输入输出写在声明里。一段逻辑换了数据还想再用,就适合收成函数。