3

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

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

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

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

4

3 回答 3

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.

于 2013-09-14T00:19:52.370 回答
3

M 文件必须是以下之一:

  1. 一个脚本
  2. 一个函数
  3. 一类

如果您不使用函数或类声明来启动 M 文件,那么它就是一个脚本。在这种情况下,没有函数可以跟随,除非是匿名函数,可以在任何地方定义。

如果文件的第一行以函数开头,那么该函数就是在 MATLAB 中运行文件时执行的函数。可以在主函数下面以任意顺序定义多个子函数。附带说明一下,函数可以选择以结尾终止,但必须始终一致地定义有或没有结尾。

Loren 讨论了 M 文件的类型以及以编程方式识别 M 文件类型的一些方法。

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

于 2013-09-14T04:53:47.413 回答
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/

于 2013-09-14T00:18:53.750 回答