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

Function 如何从单个.m matlab文件调用多个函数,function,matlab,nested-function,Function,Matlab,Nested Function,我在一个m文件中编写了一个算法,在另一个.m文件中创建了几个函数。我想调用我在与主algorithm.m文件分离的文件中创建的几个函数。我知道如何将一个函数从一个文件调用到另一个文件,但在这里我想调用我在邮件算法文件的单独文件中创建的不同函数。我在这里搜索过,但我得到的答案没有帮助,也没有谈论我想要什么 下面是我所说内容的一个小例子: main algo file N = 30; x = -10 + 20rand(1,N) for j = 1 to N c = f1(x) % here i

我在一个m文件中编写了一个算法,在另一个.m文件中创建了几个函数。我想调用我在与主algorithm.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
我想在主algo.m文件中调用F1到F4。你怎么能做到这一点。此外,如果每次运行主algo.m文件时,它都会提示我选择要调用的F1到F4函数中的哪一个,并输入一个,并在dailog框中指示该函数,它会调用该特定函数,这会更好。你知道怎么做吗?

州政府:

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®程序文件可以包含多个函数的代码。文件中的第一个函数(主函数)对其他文件中的函数可见,也可以从命令行调用它。文件中的其他函数称为本地函数。本地函数仅对同一文件中的其他函数可见

因此,实际上,您可以在这个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)

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

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

另一个解决方法是使用与原始函数相对应的
静态方法创建
。然后,所有内容都被捆绑到一个
.m
类文件中。

另一个解决方法是使用与原始函数相对应的
静态方法创建
类。然后所有内容都被绑定到一个
.m
类文件中。

所以你基本上是说我不能从主algo文件调用函数执行文件中的函数,对吗?顺便说一句,我使用的是matlab版本R2008b。@kumba严格来说,不是。但我建议了一个解决方法。请看我的编辑。哦,主要算法和所有的几个F1到F5函数必须在一个文件中。e case语句和F1到F5函数必须在主算法之后还是之前实现?@kumba对不起,你把我弄糊涂了。我得到的印象是“主算法文件”与此文件不同,其中实现了
perform
f1
f5
。现在你告诉我是同一个文件?在一个m文件中,您可以调用在其中实现的所有函数。它们实际上是不同的文件。我想你建议我把它们放在一个文件里,这就是为什么我要问。是的,主algo是一个different.m文件,包含f1到f5函数的perform也是另一个文件。所以你基本上是说我不能从主algo文件调用函数perform文件中的函数,对吗?顺便说一句,我使用的是matlab版本R2008b。@kumba严格来说,不是。但我建议了一个解决方法。请看我的编辑。哦,主要算法和所有的几个F1到F5函数必须在一个文件中。e case语句和F1到F5函数必须在主算法之后还是之前实现?@kumba对不起,你把我弄糊涂了。我得到的印象是“主算法文件”与此文件不同,其中实现了
perform
f1
f5
。现在你告诉我是同一个文件?在一个m文件中,您可以调用在其中实现的所有函数。它们实际上是不同的文件。我以为你在建议我把它们放进去