我尝试在 Matlab .m 文件中编写一个函数:
function returnValue = someFunction(x, y)
returnValue = x * y + 3
end
但是,Matlab 指出,不允许我在脚本中间简单地声明一个函数。我尝试将函数移动到文件顶部,但 Matlab 强制我将函数重命名为文件名。
我很快意识到 Matlab 函数必须与其文件名匹配。如何在单个文件中模块化我的 Matlab 代码?有没有办法在我的脚本中间定义一个函数?
匿名函数
对于非常小的函数,例如您的示例中的函数,您可以简单地定义一个匿名函数,如下所示f = @(x, y) x * y + 3
:您甚至可以在工作区的提示符或任何脚本文件中定义此类函数。
嵌套函数
如果您将 MATLAB 脚本转换为函数,它将允许您定义嵌套函数:
function a = my_script(x)
y = 3;
function r = some_function(b)
r = b * y + 3;
end
a = some_function(x)
end
请注意,嵌套函数可以看到 的值y
。例如,当您优化 ODE 的参数并且您使用的求解器不提供修改参数值的方法时,这可能很方便。
子功能
您还可以在一个文件中定义具有多个本地子函数的函数。子功能在“公共”功能下方定义。在您的示例some_function
中可能是my_script.m
.
function a = my_script(x)
y = 3;
p = 42;
a = some_function(x, y) + p;
end
function r = some_function(x, y)
r = x * y + 3;
end
end
关键字在这里是可选的。与嵌套函数相比,子函数对封装算法的片段很有帮助,因为some_function
不会看到p
.
M 文件必须是以下之一:
如果您不使用函数或类声明来启动 M 文件,那么它就是一个脚本。在这种情况下,没有函数可以跟随,除非是匿名函数,可以在任何地方定义。
如果文件的第一行以函数开头,那么该函数就是在 MATLAB 中运行文件时执行的函数。可以在主函数下面以任意顺序定义多个子函数。附带说明一下,函数可以选择以结尾终止,但必须始终一致地定义有或没有结尾。
Loren 讨论了 M 文件的类型以及以编程方式识别 M 文件类型的一些方法。
M-LINT 代码检查器会告诉您重命名函数或文件名以匹配,但这在历史上并未强制执行。
在 Matlab 中,无法在单个文件中声明多个规范函数。但是,使用匿名函数和函数式编程技术,您可能会获得一些您想要的效果。
我推荐 Loren 关于 Matlab 艺术的函数程序系列 - 我经常使用这些技术。