当我在攻读EE本科学位时,MATLAB要求每个函数都在自己的文件中定义,即使它是一行程序。
我现在正在攻读研究生学位,我必须用MATLAB写一个项目。这仍然是新版本MATLAB的要求吗?
如果可以在一个文件中放入多个函数,有什么限制吗?例如,可以从文件外部访问文件中的所有函数,还是只能访问与文件名称相同的函数?
注:我使用的是MATLAB版本R2007b。
当我在攻读EE本科学位时,MATLAB要求每个函数都在自己的文件中定义,即使它是一行程序。
我现在正在攻读研究生学位,我必须用MATLAB写一个项目。这仍然是新版本MATLAB的要求吗?
如果可以在一个文件中放入多个函数,有什么限制吗?例如,可以从文件外部访问文件中的所有函数,还是只能访问与文件名称相同的函数?
注:我使用的是MATLAB版本R2007b。
当前回答
在一个文件中拥有多个单独可访问的函数的唯一方法是使用面向对象编程定义STATIC METHODS。你可以通过myClass.static1(), myClass.static2()等方式访问这个函数。
OOP功能从R2008a开始才得到官方支持,所以除非您想使用旧的、未记录的OOP语法,否则答案是否定的,正如@ g新手所解释的那样。
编辑
在文件中定义可从外部访问的多个函数的另一种方法是创建一个返回多个函数句柄的函数。换句话说,您可以将定义函数调用为[fun1,fun2,fun3]=defineMyFunctions,之后您可以使用out1=fun1(输入)等。
其他回答
我用Octave在一个.m文件中定义了多个函数,然后在.m文件中使用命令,我需要使用该文件中的函数:
source("mycode.m");
不确定Matlab中是否有。
octave:8> help source
'source' is a built-in function
-- Built-in Function: source (FILE)
Parse and execute the contents of FILE. This is equivalent to
executing commands from a script file, but without requiring the
file to be named `FILE.m'.
你也可以把一个main文件中的函数和main函数组合在一起,就像这样:
function [varargout] = main( subfun, varargin )
[varargout{1:nargout}] = feval( subfun, varargin{:} );
% paste your subfunctions below ....
function str=subfun1
str='hello'
然后调用subfun1就像这样: str =主(“subfun1”)
我试过SCFRench和Ru Hasha的八度音。
最后它成功了,但我做了一些修改
function message = makefuns
assignin('base','fun1', @fun1); % Ru Hasha
assignin('base', 'fun2', @fun2); % Ru Hasha
message.fun1=@fun1; % SCFrench
message.fun2=@fun2; % SCFrench
end
function y=fun1(x)
y=x;
end
function z=fun2
z=1;
end
可以在其他'm'文件中调用:
printf("%d\n", makefuns.fun1(123));
printf("%d\n", makefuns.fun2());
更新:
我添加了一个答案,因为+72和+20都不适合我。 我写的那个很好(上周五我在写这篇文章的时候测试了一下)。
我真的很喜欢SCFrench的答案——我想指出,它可以很容易地修改,使用assignin函数直接将函数导入到工作区。(这样做让我想起了Python“import x from y”的做事方式)
function message = makefuns
assignin('base','fun1',@fun1);
assignin('base','fun2',@fun2);
message='Done importing functions to workspace';
end
function y=fun1(x)
y=x;
end
function z=fun2
z=1;
end
然后这样使用:
>> makefuns
ans =
Done importing functions to workspace
>> fun1(123)
ans =
123
>> fun2()
ans =
1
从R2017b开始,这是不可能的。有关文件指出:
程序文件可以包含多个函数。如果文件只包含函数定义,则第一个函数是主函数,也是MATLAB与文件名关联的函数。在主函数或脚本代码之后的函数称为局部函数。本地函数仅在文件中可用。
但是,其他答案中建议的变通方法也可以达到类似的效果。