我尝试在Matlab .m文件中编写一个函数:
function returnValue = someFunction(x, y)
returnValue = x * y + 3
end
然而,Matlab指出我不允许在脚本中间简单地声明一个函数。我尝试将函数移动到文件的顶部,但是Matlab强迫我将我的函数重命名为文件名。
我很快意识到Matlab函数必须与其文件名相匹配。如何在单个文件中模块化我的Matlab代码?有没有办法在剧本中间定义一个函数?
答案 0 :(得分:6)
匿名函数
对于非常小的函数,例如示例中的函数,您可以简单地定义一个匿名函数: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
的值。
答案 1 :(得分:3)
M文件必须是以下之一:
如果您没有使用函数或类声明启动M文件,那么它是一个脚本。在这种情况下,除非是匿名函数,否则不能跟随任何函数,可以在任何地方定义。
如果文件的第一行以函数开头,那么这是在MATLAB中运行文件时执行的函数。可以在主函数下面以任何顺序定义多个子函数。在旁注中,函数可以选择以一个结尾终止,但是必须一直定义所有函数,无论是否有结尾。
Loren discusses the types of M files以及一些以编程方式识别M文件类型的方法。
M-LINT代码检查器会告诉您重命名要匹配的函数或文件名,但这在历史上尚未强制执行。
答案 2 :(得分:1)
无法在单个文件中在Matlab中声明多个规范函数。但是,使用匿名函数和函数编程技术可以实现一些您想要的效果。
我推荐Loren的Matlab功能程序系列 - 我定期使用这些技术。