是否有可能在MATLAB中为每个文件定义多个函数,并从该文件外部访问它们?
当我在攻读EE专业的本科学位时,MATLAB需要在自己的文件中定义每个函数,即使它是一行代码。
我正在攻读研究生学位,我必须在MATLAB中编写一个项目。 这仍然是更新版本的MATLAB的要求吗?
如果可以在一个文件中放入多个函数,这个有什么限制吗? 例如,可以从文件外部访问文件中的所有function,还是只能访问与文件名称相同的function?
注意:我正在使用MATLAB版本R2007b。
m文件(即主函数 )中的第一个函数在调用m文件时被调用。 主函数不需要与m文件具有相同的名称,但为了清晰起见,它应该是这样 。 当function和文件名称不同时,必须使用文件名称来调用主函数。
m文件中的所有后续函数(称为本地函数 (或旧术语中的“子函数”))只能由该m文件中的主函数和其他本地函数调用。 其他m文件中的函数不能调用它们。
另外,还可以在其他函数中声明函数。 这些被称为嵌套函数 ,只能从嵌套函数中调用。 他们也可以访问嵌套函数中的variables,这使得它们非常有用,尽pipe稍微有些棘手。
更多的想法…
上面提到的正常函数范围映射行为有很多方法,例如Jonas的答案中提到的将函数句柄作为输出parameter passing。 但是,我不会build议把它作为一个这样的技巧的习惯,因为有可能有更好的select来组织你的文件。
例如,假设您在m文件Am
具有一个主函数A
以及本地函数D
, E
和F
现在我们假设在m文件Bm
和Cm
中分别有两个相关的函数B
和C
,您也可以调用D
, E
和F
这里有一些选项:
-
把
D
,E
和F
分别放在各自的m文件中,允许其他函数调用它们。 缺点是这些函数的范围很大,并不局限于A
,B
和C
,但好处是这很简单。 -
用
D
,E
和F
创build一个defineMyFunctions
m文件(就像Jonas的例子中的那样)作为本地函数和一个简单的返回函数句柄的主函数。 这允许你将D
,E
和F
在同一个文件中,但是这些函数的作用域并没有做任何事情,因为任何可以调用defineMyFunctions
函数都可以调用它们。 你也必须担心传递函数句柄作为参数,以确保你有他们需要他们的地方。 -
将
D
,E
和F
复制到Bm
和Cm
作为本地function。 这将它们的使用范围限制为A
,B
和C
,但由于在不同的地方有相同代码的三个副本,所以更新和维护代码是一场噩梦。 -
使用私人function ! 如果在同一个目录中有
A
,B
和C
,则可以创build一个名为private
的子目录,并在其中放置D
,E
和F
,每个都作为一个单独的m文件。 这限制了它们的范围,所以它们只能被上面的目录(即A
,B
和C
)中的函数调用,并将它们放在同一个地方(但仍然是不同的m文件):myDirectory/ Am Bm Cm private/ Dm Em Fm
所有这些都超出了你的问题的范围,可能比你需要的更详细,但是我认为可能会考虑组织你所有m文件这个更普遍的问题。 ;)
一般来说,你的问题的答案是否定的,你不能为每个文件定义多个外部可见的函数。 不过,您可以将函数句柄返回给本地函数,而且一个方便的方法是使它们成为结构体的字段。 这里是一个例子:
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
在单个文件中具有多个可单独访问的函数的唯一方法是使用面向对象编程来定义静态方法 。 你可以像myClass.static1()
, myClass.static2()
等那样访问函数。
OOPfunction从R2008a开始才正式得到支持,所以除非你想使用旧的,没有logging的OOP语法,否则你的答案是否定的,正如@gnovice所解释的那样 。
编辑
在外部可访问的文件中定义多个函数的另一种方法是创build一个返回多个函数句柄的函数 。 换句话说,你可以把你的定义函数称为[fun1,fun2,fun3]=defineMyFunctions
,之后你可以使用out1=fun1(inputs)
等
我真的很喜欢SCFrench的回答 – 我想指出的是,它可以很容易地修改,以使用assignin函数直接导入到工作区的function。 (像这样做让我想起很多Python的“从ximport”的方式)
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
沿着SCFrench的答案,但更多的C#风格的旋转..
我会(经常)做一个包含多个静态方法的类。 例如:
classdef Statistics methods(Static) function val = MyMean(data) val = mean(data); end function val = MyStd(data) val = std(data); end end end
由于这些方法是静态的,所以你不需要实例化类。 你调用的function如下:
data = 1:10; mean = Statistics.MyMean(data); std = Statistics.MyStd(data);
我使用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'.
你也可以把一个主文件中的函数和主函数一起看起来像这样:
function [varargout] = main( subfun, varargin ) [varargout{1:nargout}] = feval( subfun, varargin{:} ); % paste your subfunctions below .... function str=subfun1 str='hello'
然后调用subfun1将如下所示:str = main('subfun1')
从R2017b开始,这不是正式的可能。 相关文件指出:
程序文件可以包含多个function。 如果文件仅包含函数定义,则第一个函数是主函数,并且是MATLAB与文件名关联的函数。 遵循主函数或脚本代码的函数称为本地函数。 本地function只能在文件中使用。
但是,其他答案中提出的解决方法可以实现类似的function。