2013-07-03 75 views
0

我有一个算法写在一个m文件中,我有几个函数,我在另一个.m文件中创建。我想从主算法.m文件中将这几个函数称为独立文件。我知道如何从一个文件调用另一个函数,但在这里我想调用不同的函数,我在我的邮件算法文件中创建了一个单独的文件。我已经在这里搜索,但我得到的答案没有帮助,并没有谈论我想要什么。如何从一个.m matlab文件调用多个函数

这里是我所谈论的是一个小例证:有几个可变

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 

我想被要求在F1至F4主要的algo .m文件。你怎么能这样做。另外它会更好,如果每次我运行主要算法.m文件时,它会提示我选择要调用的F1到F4函数中的哪一个函数,并且我输入并在dailog框中指示该函数,它会调用该特定函数功能。有关如何做到这一点的任何想法吗?

+1

@Shai不知道它是重复的。在你的问题中,你不想接受改变公共功能的解决方案,而在这里OP_implements_它,所以我想他是开放的建议... –

+0

@EitanT如果他愿意改变实施,为什么不把每个私有函数写在它自己的m文件中并完成它?如果他想要更多的挑战让自己的生活变得更加复杂,那么他可能会试着用10本平衡在头顶的书来实现它... – Shai

+0

@Shai我也会这样做(关于m文件,而不是书),但我可以理解为什么要避免混乱的m文件。 –

回答

2

MATLAB documentation状态:

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

所以其实,你可以叫这个M文件之外的唯一功能是第一个功能(这是perform在你的例子),而功能f1,...,f5只能在内部调用m-file,因为它们是本地

我的建议是坚持推荐的做法,并在自己的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) 
+0

所以你基本上说我不能调用函数在函数中执行主算法文件中的文件,对吗?顺便说一句,我正在使用matlab版本R2008b。 – kumba

+0

@ kumba严格地说,没有。但我已经提出了一个解决方法。请参阅我的编辑。 –

+0

哦,主算法和所有的几个F1到F5函数必须在一个文件中。是否必须在主算法之后或之前实施电子病例陈述和F1至F5功能? – kumba

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 
+0

如果你说%“包含”函数定义,你是指sytax? #include f1; #include f2;等等? – kumba

+0

@kumba:更像是你会在C/C++中使用'#include“functions.h”',其中'functions.h'包含* all *你的函数定义。这个想法或多或少是相同的,但是当然,完全不同的语法(例如,不需要'functions.cpp'文件) –

+1

@kumba'%include'部分不过是一个评论,实际上,Rody的代码在主工作区中创建了一个函数句柄的单元阵列,并且通过访问适当的单元格调用每个函数,_e.g_调用'f1 (x)'就像这样:'f {1}(x)'。 –

1

另一种解决方法是创建一个classstatic相当于原来的功能的方法。然后所有东西都捆绑到一个.m类文件中。

相关问题