当我在攻读EE本科学位时,MATLAB要求每个函数都在自己的文件中定义,即使它是一行程序。
我现在正在攻读研究生学位,我必须用MATLAB写一个项目。这仍然是新版本MATLAB的要求吗?
如果可以在一个文件中放入多个函数,有什么限制吗?例如,可以从文件外部访问文件中的所有函数,还是只能访问与文件名称相同的函数?
注:我使用的是MATLAB版本R2007b。
当我在攻读EE本科学位时,MATLAB要求每个函数都在自己的文件中定义,即使它是一行程序。
我现在正在攻读研究生学位,我必须用MATLAB写一个项目。这仍然是新版本MATLAB的要求吗?
如果可以在一个文件中放入多个函数,有什么限制吗?例如,可以从文件外部访问文件中的所有函数,还是只能访问与文件名称相同的函数?
注:我使用的是MATLAB版本R2007b。
当前回答
我试过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都不适合我。 我写的那个很好(上周五我在写这篇文章的时候测试了一下)。
其他回答
通常,你的问题的答案是否定的,你不能在一个文件中定义一个以上的外部可见函数。不过,可以将函数句柄返回给局部函数,一种方便的方法是将它们设置为结构体的字段。这里有一个例子:
function funs = makefuns
funs.fun1=@fun1;
funs.fun2=@fun2;
end
function y=fun1(x)
y=x;
end
function z=fun2
z=1;
end
下面是如何使用它:
>> myfuns = makefuns;
>> myfuns.fun1(5)
ans =
5
>> myfuns.fun2()
ans =
1
我真的很喜欢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
我用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”)
从R2017b开始,这是不可能的。有关文件指出:
程序文件可以包含多个函数。如果文件只包含函数定义,则第一个函数是主函数,也是MATLAB与文件名关联的函数。在主函数或脚本代码之后的函数称为局部函数。本地函数仅在文件中可用。
但是,其他答案中建议的变通方法也可以达到类似的效果。