如何在不创建多个文件的情况下将我的Matlab代码分解为函数?

时间:2013-09-14 00:10:03

标签: matlab function

我尝试在Matlab .m文件中编写一个函数:

function returnValue = someFunction(x, y)
returnValue = x * y + 3
end

然而,Matlab指出我不允许在脚本中间简单地声明一个函数。我尝试将函数移动到文件的顶部,但是Matlab强迫我将我的函数重命名为文件名。

我很快意识到Matlab函数必须与其文件名相匹配。如何在单个文件中模块化我的Matlab代码?有没有办法在剧本中间定义一个函数?

3 个答案:

答案 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文件必须是以下之一:

  1. 脚本
  2. 功能
  3. 一堂课
  4. 如果您没有使用函数或类声明启动M文件,那么它是一个脚本。在这种情况下,除非是匿名函数,否则不能跟随任何函数,可以在任何地方定义。

    如果文件的第一行以函数开头,那么这是在MATLAB中运行文件时执行的函数。可以在主函数下面以任何顺序定义多个子函数。在旁注中,函数可以选择以一个结尾终止,但是必须一直定义所有函数,无论是否有结尾。

    Loren discusses the types of M files以及一些以编程方式识别M文件类型的方法。

    M-LINT代码检查器会告诉您重命名要匹配的函数或文件名,但这在历史上尚未强制执行。

答案 2 :(得分:1)

无法在单个文件中在Matlab中声明多个规范函数。但是,使用匿名函数和函数编程技术可以实现一些您想要的效果。

我推荐Loren的Matlab功能程序系列 - 我定期使用这些技术。

http://blogs.mathworks.com/loren/2013/01/10/introduction-to-functional-programming-with-anonymous-functions-part-1/

http://blogs.mathworks.com/loren/2013/01/24/introduction-to-functional-programming-with-anonymous-functions-part-2/

http://blogs.mathworks.com/loren/2013/02/07/introduction-to-functional-programming-with-anonymous-functions-part-3/