代码之家  ›  专栏  ›  技术社区  ›  Nathan Fellman

是否可以在matlab中为每个文件定义多个函数,并从该文件外部访问它们?

  •  200
  • Nathan Fellman  · 技术社区  · 15 年前

    当我在EE学习本科学位时,Matlab要求在自己的文件中定义每个函数,即使它是一行代码。

    我现在正在攻读研究生学位,我必须用matlab编写一个项目。这仍然是对较新版本的matlab的要求吗?

    如果可以在一个文件中放置多个函数,是否对此有任何限制?例如,是否可以从文件外部访问文件中的所有函数,或者只访问与文件同名的函数?

    注:我使用的是Matlab版本R2007B。

    9 回复  |  直到 7 年前
        1
  •  260
  •   gnovice    8 年前

    m文件中的第一个函数(即 main function ,在调用m文件时调用。它不是 必修的 主函数与m文件同名,但为了清晰起见, 应该 . 当函数和文件名不同时, 文件名 必须用于调用主函数。

    m文件中的所有后续函数,调用 local functions (或旧术语中的“子函数”),只能由该m文件中的主函数和其他本地函数调用。其他m文件中的函数不能调用它们。从R2016B开始,您可以 add local functions to scripts 此外,尽管范围行为仍然相同(即只能从脚本中调用它们)。

    此外,还可以声明函数 在内部 其他功能。这些叫做 nested functions ,并且只能从嵌套的函数中调用这些函数。它们还可以访问嵌套函数中的变量,这使得它们非常有用,尽管使用起来有点困难。

    更多思考的食物…

    有一些方法可以绕过上面概述的正常函数范围行为,例如传递 function handles 作为输出参数,如回答中所述 SCFrench Jonas (从R2013B开始,通过 localfunctions 函数)。但是,我不建议将其作为一种使用此类技巧的习惯,因为对于组织函数和文件,可能有更好的选择。

    例如,假设您有一个主函数 A 在M文件中 A.m 以及本地功能 D , E F . 现在假设你还有两个相关的功能 B C 在M文件中 B.m C.m ,分别是,您还希望能够调用 D , e f . 以下是一些选项:

    • D , e f 每个都在各自独立的m文件中,允许任何其他函数调用它们。缺点是这些功能的范围很大,而且不局限于 , C 但好处是这很简单。

    • 创建一个 defineMyFunctions m-file(如jonas的例子)与 D , e f 作为本地函数和只返回函数句柄的主函数。这样你就可以 D , e f 在同一个文件中,但它对这些函数的作用域没有任何作用,因为可以调用 定义功能 可以调用它们。然后,您还必须担心将函数句柄作为参数传递,以确保您在需要它们的地方拥有它们。

    • 拷贝 D , e f 进入之内 B.M C.M 作为本地功能。这将它们的使用范围限制为 , C 但是,使代码的更新和维护成为一场噩梦,因为在不同的地方有三个相同代码的副本。

    • 使用 private functions ! 如果你有 , C 在同一目录中,可以创建名为 private 地点 D , e f 在那里,每个都是单独的M文件。这限制了它们的作用域,因此它们只能由上面目录中的函数调用(即 , C )把它们放在同一个地方(但仍然是不同的M文件):

      myDirectory/
          A.m
          B.m
          C.m
          private/
              D.m
              E.m
              F.m
      

    所有这些都超出了您的问题范围,可能比您需要的更详细,但我认为最好是触及到组织所有M文件的更普遍的关注点。;)

        2
  •  74
  •   SCFrench    15 年前

    通常,问题的答案是“否”,每个文件不能定义多个外部可见的函数。但是,您可以将函数句柄返回到本地函数,这样做的一个方便方法是将它们设置为结构的字段。下面是一个例子:

    function funs = makefuns
      funs.fun1=@fun1;
      funs.fun2=@fun2;
    end
    
    function y=fun1(x)
      y=x;
    end
    
    function z=fun2
      z=1;
    end
    

    它的使用方法如下:

    >> myfuns = makefuns;
    >> myfuns.fun1(5)    
    ans =
         5
    >> myfuns.fun2()     
    ans =
         1
    
        3
  •  36
  •   Community Mohan Dere    9 年前

    在单个文件中具有多个可单独访问的函数的唯一方法是定义 STATIC METHODS 使用 object-oriented programming . 您可以访问函数 myClass.static1() , myClass.static2() 等。

    OOP功能只有在R2008A之后才得到官方支持,因此除非您想使用旧的、未记录的OOP语法,否则您的答案是“否”,解释如下 @gnovice .

    编辑

    在一个文件中定义多个可以从外部访问的函数的另一种方法是创建一个返回多个函数的函数 function handles . 换句话说,您将定义函数称为 [fun1,fun2,fun3]=defineMyFunctions ,之后您可以使用 out1=fun1(inputs) 等。

        4
  •  22
  •   Ru Hasha    13 年前

    我真的很喜欢scfrench的答案-我想指出,可以很容易地修改它来导入函数 直接地 使用assignin函数进入工作区。(这样做会让我想起许多Python的“从y导入x”方法)

    function message = makefuns
      assignin('base','fun1',@fun1);
      assignin('base','fun2',@fun2);
      message='Done importing functions to workspace';
    end
    
    function y=fun1(x)
      y=x;
    end
    
    function z=fun2
      z=1;
    end
    

    然后又用了:

    >> makefuns
    ans =
    Done importing functions to workspace
    
    >> fun1(123)
    ans =
       123
    
    >> fun2()
    ans =
         1
    
        5
  •  8
  •   SmallJoeMan    12 年前

    与scfrench的答案相同,但更倾向于C型旋转。

    我会(并且经常这样做)创建一个包含多个静态方法的类。例如:

    classdef Statistics
    
        methods(Static)
            function val = MyMean(data)
                val = mean(data);
            end
    
            function val = MyStd(data)
                val = std(data);
            end
        end
    
    end
    

    因为方法是静态的,所以不需要对类进行实例化。调用函数如下:

    data = 1:10;
    
    mean = Statistics.MyMean(data);
    std = Statistics.MyStd(data);     
    
        6
  •  4
  •   J.D.    13 年前

    我在一个.m文件中用八度线定义了多个函数,然后在需要使用该文件中函数的.m文件中使用命令:

    source("mycode.m");
    

    不确定Matlab是否提供。

    octave:8> help source
    'source' is a built-in function
    
     -- Built-in Function:  source (FILE)
         Parse and execute the contents of FILE.  This is equivalent to
         executing commands from a script file, but without requiring the
         file to be named `FILE.m'.
    
        7
  •  3
  •   Thierry Dalon    13 年前

    您还可以将一个主文件中的函数与如下所示的主函数组合在一起:

    function [varargout] = main( subfun, varargin )
    [varargout{1:nargout}] = feval( subfun, varargin{:} ); 
    
    % paste your subfunctions below ....
    function str=subfun1
    str='hello'
    

    然后打电话 子基金会 如下所示: str=main('subfun1')

        8
  •  0
  •   Dev-iL    8 年前

    截至2017年b月,这在官方上是不可能的。这个 relevant documentation 声明:

    程序文件可以包含多个函数。如果文件只包含函数定义,则第一个函数是主函数,并且是matlab与文件名关联的函数。遵循主函数或脚本代码的函数称为本地函数。本地函数仅在文件中可用。

    然而,其他答案中建议的解决方法也可以达到类似的效果。

        9
  •  -1
  •   Gromph    7 年前

    我试过了 SCFRench 并与 Ru Hasha 八度音阶

    最后它起作用了: 但是我做了一些修改

    function message = makefuns
        assignin('base','fun1', @fun1);   % Ru Hasha
        assignin('base', 'fun2', @fun2);  % Ru Hasha
        message.fun1=@fun1;               % SCFrench
        message.fun2=@fun2;               % SCFrench
    end
    
    function y=fun1(x)
        y=x;
    end
    
    function z=fun2
        z=1;
    end
    

    可在其他“m”文件中调用:

    printf("%d\n", makefuns.fun1(123));
    printf("%d\n", makefuns.fun2());
    

    更新:

    我加了一个答案是因为 也不 +72和+20 工作 对我来说是八度音阶。 我写的那篇文章写得很好(上星期五我写这篇文章的时候做了测试)。

    推荐文章