如何从单个.m matlab文件中调用多个函数

时间:2013-07-03 10:48:48

标签: function matlab nested-function

我有一个写在一个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框中指示该功能,它会调用该特定的功能。有关如何做到这一点的任何想法吗?

3 个答案:

答案 0 :(得分:2)

MATLAB documentation州:

  

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

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

我的建议是坚持推荐的做法,并在自己的m文件中定义每个功能。但是,如果您不希望以多个m文件结束,并且坚持在同一个m文件中实现所有函数,则可以通过将其他参数传递给main函数来解决此问题,如下所示:

f5

然后通过使用适当的函数名字符串调用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 来调用每个函数f1,...,f5。例如:

perform

答案 1 :(得分:1)

另一种解决方法是使用与您原始功能相对应的class方法创建static。然后将所有内容捆绑到一个.m类文件中。

答案 2 :(得分:0)

只是为了补充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