【问题标题】:How can I break up my Matlab code into functions without creating many files?如何在不创建许多文件的情况下将我的 Matlab 代码分解为函数?
【发布时间】:2013-09-14 00:10:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 使用多个文件有什么问题?
  • @poorsod:对于像这样的非常小的一行操作,我认为将它们放在一个文件中会更具可读性;有点像在 C++ 函数中使用 inline 关键字

标签: matlab function


【解决方案1】:

匿名函数

对于示例中的非常小的函数,您可以简单地定义一个匿名函数,如下所示: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 的值。

【讨论】:

【解决方案2】:

M 文件必须是以下之一:

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

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

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

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

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

【讨论】:

  • @LuisMendo 啊,我的第一个答案。 :D
  • 哦,真的吗?嘿,我印象深刻。我什至不记得我的第一个答案:-)
  • 我必须查看我的个人资料才能知道我的第一个答案是什么。我并不为此感到特别自豪:-)
【解决方案3】:

没有办法在一个文件中在 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/

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2017-08-18
    • 2019-07-13
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2020-03-04
    • 2014-10-21
    相关资源
    最近更新 更多