【问题标题】:How to call multiple functions from a single .m matlab file [duplicate]如何从单个.m matlab文件中调用多个函数[重复]
【发布时间】:2013-07-03 10:48:47
【问题描述】:

我在一个 m 文件中编写了一个算法,并且我在另一个 .m 文件中创建了几个函数。我想调用我在与主算法 .m 文件分开的文件中创建的这几个函数。我知道如何从一个文件调用一个函数到另一个函数,但在这里我想调用我在与我的邮件算法文件不同的文件中创建的不同函数。我在这里搜索过,但我得到的答案没有帮助,也不是在谈论我想要什么。

这是我在说什么的一个小例子:

main algo file
N = 30;
x = -10 + 20rand(1,N)
for j = 1 to N
  c = f1(x) % here i need to call different functions from another file
end

具有多个变量的函数-这是一个单独的文件

Function perform

%% Function F1
f = f1(x)
 statements
end

%% Function F2
f = f2(x)
 statements
end

%% Function F3
f = f3(x)
 statements
end

%% Function F4
f = f4(x)
 statements
end

%% Function F5
f = f5(x)
 statements
end

end Perform

我想在主算法 .m 文件中调用 F1 到 F4。你怎么能这样做。此外,如果每次我运行主算法 .m 文件时会更好,它会提示我选择我要调用的 F1 到 F4 函数中的哪一个,并且我输入并在 dailog 框中指示函数,它调用那个特定的功能。请问有什么办法吗?

【问题讨论】:

  • @Shai 不确定是否重复。在您的问题中,您不想接受改变公共功能的解决方案,而在这里 OP 实施 它,所以我想他愿意接受建议......
  • @EitanT 如果他愿意更改实现,为什么不将每个私有函数写入自己的 m 文件并完成它呢?如果他想要更多的挑战,让他的生活变得更复杂,他不妨尝试在头顶平衡 10 本书来实现它......
  • @Shai 我也会这样做(关于 m 文件,而不是书籍),但我可以理解为什么要避免混乱的 m 文件。
  • @EitanT 你也应该试试这些书;)
  • @Shai,我试图避免有很多 m 文件。我知道这样更容易。

标签: function matlab nested-function


【解决方案1】:

MATLAB documentation 声明:

MATLAB® 程序文件可以包含多个函数的代码。文件中的第一个函数(主函数)对其他文件中的函数可见,或者您可以从命令行调用它。文件中的附加函数称为局部函数。本地函数只对同一文件中的其他函数可见。

所以事实上,你可以在这个m文件之外调用的唯一函数是第一个函数(在你的例子中是perform),而函数f1,...,f5只能是在 m 文件中调用,因为它们是 本地的

我的建议是坚持推荐的做法,并在自己的 m 文件中定义每个函数。但是,如果您不想以大量 m 文件结束,并坚持在同一个 m 文件中实现所有函数,则可以通过向主函数传递附加参数来解决此问题,如下所示:

function f = perform(func, x);
    switch(func)
        case 'f1'
            f = f1(x);
        case 'f2'
            f = f2(x);
        case 'f3'
            f = f3(x);
        case 'f4'
            f = f4(x);
        case 'f5'
            f = f5(x);
        otherwise
            error(['Unknown function ', func]);
    end

%// ... next follows the implementation of f1 through f5

然后通过使用适当的函数名称字符串调用perform 来调用每个函数f1、...、f5。例如:

perform('f1', some_variable)

【讨论】:

  • 所以你基本上是说我不能从主算法文件调用函数执行文件中的函数,对吧?顺便说一句,我使用的是 matlab 版本 R2008b。
  • @kumba 严格来说,没有。但我为此提出了一种解决方法。请查看我的编辑。
  • 哦,主算法和所有几个 F1 到 F5 函数必须在一个文件中。 e case语句和F1到F5函数必须在主算法之后还是之前实现?
  • @kumba 对不起,你让我很困惑。 In the first comment 我的印象是“主算法文件”与这个文件不同,其中实现了performf1f5。现在你告诉我这是同一个文件?在 m 文件中,您可以调用在其中实现的所有函数。
  • 它们实际上是不同的文件。我虽然您建议我将它们放在一个文件中,但这就是我问的原因。是的,主算法是一个不同的 .m 文件,具有 f1 到 f5 函数的执行也是另一个文件。
【解决方案2】:

另一种解决方法是创建一个 classstatic 方法对应于您的原始函数。然后将所有内容捆绑到一个 .m 类文件中。

【讨论】:

    【解决方案3】:

    只是为了补充 Eitan T 的回答;在大多数 C 系列语言(实际上还有很多其他语言)中发现的“包含文件”类比之后,还有另一种解决方法。它是这样工作的:

    主算法文件:

    function main
    
        %// "include" the function definitions 
        f = declareFunctions;
    
        %// Call desired function like so
        for jj = 1:N
            c1 = f{1}(x)  %// call f1(x)
            c2 = f{2}(x)  %// call f2(x)
            %// ...
            cN = f{N}(x)  %// call fN(x)
        end
    
    end
    

    函数定义文件:

    %// "Declare" all subfunctions in a caller's workspace
    function fs = declareFunctions
    
        fs = {...
            @f1,...
            @f2,...
            @f3,...
            %//... etc.
            @fN
        };
    
    end
    
    %// first function 
    function y = f1(x)
       %// f1's code
    end
    
    
    %// Second function 
    function y = f2(x)
       %// f2's code
    end
    
    %// ...
    
    %// Nth function 
    function y = fN(x)
       %// fN code
    end
    

    【讨论】:

    • 如果你说 % "include" 函数定义,你的意思是语法吗? #包括f1; #包括f2;等等?
    • @kumba:更像是你在 C/C++ 中使用的#include "functions.h",其中functions.h 包含所有你的函数定义。这个想法或多或少是相同的,但当然,语法完全不同(例如,不需要functions.cpp 文件)
    • @kumba % include 部分不过是一条注释,向您展示了 Rody 实现的内容与 C 中 #include 的功能之间的相似性。在实践中,Rody 的代码创建了一个函数元胞数组主工作区中的句柄,并通过访问相应的单元格来调用每个函数,例如调用f1(x),如下所示:f{1}(x)
    • matlab 中的包含语法是没有得到的。以前没用过,这次想试试,但是不知道语法。
    • @kumba 同样,MATLAB 中没有包含语法。 Rody 所写的内容类似于 C 语言中的#include,这意味着它创建了一个函数句柄数组,您可以使用这些句柄来调用这些函数。
    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多