2

我在一个 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 框中指示函数,它调用那个特定的功能。请问如何做到这一点?

4

3 回答 3

3

MATLAB 文档指出:

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

所以实际上,您可以在此 m 文件之外调用的唯一函数是第一个函数(perform在您的示例中),而函数f1, ...f5只能在 m 文件内部调用,因为它们是local

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

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

perform('f1', some_variable)
于 2013-07-03T10:55:05.043 回答
1

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

于 2013-07-03T15:06:00.037 回答
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
于 2013-07-03T11:53:30.657 回答