【问题标题】:In MATLAB, can I have a script and a function definition in the same file?在 MATLAB 中,我可以在同一个文件中包含脚本和函数定义吗?
【发布时间】:2011-07-18 19:35:33
【问题描述】:

假设我有一个函数f(),我想在my_file.m中使用它,这是一个脚本。

  1. 是否可以在my_file.m中定义函数?
  2. 如果不是,假设我在f.m 中定义了它。我如何在my_file.m 中调用它?

我阅读了在线文档,但不清楚什么是最好的方法。

【问题讨论】:

  • 请注意,您可以将函数放入 Octave 的脚本中。
  • 考虑这个答案来组织你的代码stackoverflow.com/a/3569946/18775
  • 真正的问题应该是:我应该向 Mathworks 的谁投诉来修复这个荒谬的错误?
  • 从 MATLAB 2016b 开始,可以在脚本中定义函数。我不知道他们为什么要等 32 年才添加这个相当基本的功能。

标签: file matlab function


【解决方案1】:

1) 不能在脚本中嵌套函数。

2) 确保 f.m 在您的路径或当前目录中,您可以像调用任何其他函数一样调用它。

【讨论】:

  • 如果您遵循@Oneiros 的建议,您可以在脚本中嵌套一个函数。你甚至可以在你的脚本中调用你的函数(在他的例子中是f)(在他的例子中是my_file)。
【解决方案2】:

从 R2016b 版本开始,您可以拥有 local functions in scripts,如下所示:

data = 1:10;            % A vector of data
squaredData = f(data);  % Invoke the local function

function y = f(x)
  y = x.^2;
end

在发布 R2016b 之前,唯一可以在 MATLAB 脚本中定义的 type of functionanonymous function。例如:

data = 1:10;            % A vector of data
f = @(x) x.^2;          % An anonymous function
squaredData = f(data);  % Invoke the anonymous function

请注意,匿名函数更适合简单的操作,因为它们必须在单个表达式中定义。对于更复杂的函数,您必须在它们自己的文件中定义它们,place them somewhere on the MATLAB path 以便您的脚本可以访问它们,然后像​​调用任何其他函数一样从您的脚本中调用它们。

【讨论】:

    【解决方案3】:

    我绕过这个限制的方法是将我的脚本变成不带参数的函数(如果我需要来自全局命名空间的变量,我要么在函数中显式传递它们,要么使用“evalin”来获取它们。 )

    然后您可以在“脚本”中定义所有您需要的附加功能。这是一个 hack,但我发现它在我需要几个重要功能的情况下非常强大。

    编辑:这是一个简单的例子。所有这些都可以驻留在一个文件中。

    function [] = myScriptAsAFunction()
       img = randn(200);
       img = smooth(img);
       figure(1);
       imagesc(img);
       axis image;
       colorbar;
    end
    
    function simg = smooth(img)
        simg = img / 5;
    end
    

    【讨论】:

    • +1,当我看清楚的时候真的很烦;关闭所有;在 matlab 脚本的顶部。如果你有这么多变量和浮动的图,你无法跟踪它们,你没有使用足够的函数。
    • 能否请您提供这个“hack”的示例实现?我似乎无法弄清楚这是如何工作的。
    • 请注意,这种方法的一个问题是,当函数退出时,变量永远不会进入您的工作区。如果您想在脚本结束时播放/查看/使用这些变量,这可能是个问题。
    • @chessofnerd 当我遇到问题时,我要么在函数输出中返回变量,要么使用assignin。
    • @John,我个人觉得必须单独返回所有变量而不是让它们自己出现在工作空间中有点痛苦。也就是说,我从未听说过assignin。这是一个简洁的功能,我可能会使用更多!
    【解决方案4】:

    你可以这样做(假设你的文件名为my_file.m):

    function my_file
       %script here
    end
    
    function out = f(in)
       %function here
    end
    

    如果您点击运行按钮,函数my_file将默认执行。

    【讨论】:

    • 这和约翰的回答有区别吗?
    【解决方案5】:

    您可以在一个示例文件中包含许多函数。但是,当您运行文件时,只有第一个可以充当主要功能。其他的只能在这个文件中使用。对于某些情况,您想定义一个大函数。您可以将其拆分为更小的函数并在其下方定义。

    不过,找到答案最简单的方法就是试一试~

    【讨论】:

      【解决方案6】:

      我已经实现了the solution by John,我发现它很有用。但是有几个注意事项(在 Octave 中;Matlab 的行为可能类似):

      1. 如果您的主函数中的代码在使用辅助函数之前包含clear all,它将不起作用。在文件test3.m 中,注释/取消注释clear all 使代码工作/不工作。

        function [] = test3()
          %clear all
          a = myfunc( 1 );
          a
        endfunction;
        
        %---------------------------------
        % Auxiliary functions
        
        function retval = myfunc( a )
          retval = 2 * a;
        endfunction;
        

        似乎在运行脚本时,第一次执行函数外部的代码(在这种情况下,没有这样的代码)和定义的函数(在这种情况下,test3myfunc ) 被添加到工作区。第二遍将执行 main 函数,如果 clear all 处于活动状态,它将找不到 myfunc

      2. 正如 chessofnerd 所指出的,开箱即用的主函数中的变量不会进入工作区。

      【讨论】:

        【解决方案7】:

        As of R2016b,您可以在脚本中定义本地函数。

        x = 1;
        y = add1(x);
        
        function z = add1(x)
            z = x + 1;
        end
        

        【讨论】:

          猜你喜欢
          • 2020-02-14
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 2011-07-10
          • 1970-01-01
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          相关资源
          最近更新 更多