2011-05-12 75 views
0

可能重复:
Is it possible to define more than one function per file in MATLAB?有没有办法从文件外部调用MATLAB的“子功能”?

为了定义一个MATLAB(不是匿名的)功能,您需要创建具有相同的名称作为函数的文件;例如,一个函数调用MYFUNC可以在文件myfunc.m被定义为每:

function rtn = myfunc(arg) 
% do some stuff 
end 

假设在同一个文件myfunc.m,我也有一个子功能,如

function rtn = myfunc(arg) 
% do some stuff 
end 

function rtn = mysubfunc(arg) 
% do some other stuff 
end 

据我所知,有没有办法从执行subfunc.m文件以外的任何地方发生访问mysubfunc。在MATLAB(R2010b)中,我一直都很担心这种小小的特质。我错了 - 是否有任何方式来呼叫mysubfunc从外部myfunc.m

更新:新问题:有没有什么方法做到这一点?或者我应该真的把它吸了起来,并继续制作更多文件?

+0

不,你必须把它吸起来。我使用半命名空间方法来减少混乱,并鼓励我重用自己的代码(例如,在'heatflux'项目中,我将使用hf_开始所有函数名称)。 – Alex 2011-05-12 07:14:21

+0

这里你的目标是什么?你只是想减少在一个单独的文件中的每个功能的混乱? – 2011-05-12 18:28:40

+0

如果您需要访问myfunc之外的子函数,那么几乎按照定义,它不应该是子函数。子函数应该保留用于仅在封闭函数的上下文中相关的通用功能。 – Marc 2011-05-13 19:31:27

回答

9

你可以让它们成为工具类的所有静态方法。这些函数可以通过名称全局引用,但只需要管理一个M文件。

classdef mystuff % in mystuff.m 
    %MYSTUFF Utility functions for something or other... 
    methods (Static = true) 
     function rtn = myfunc(arg) 
     disp('myfunc'); 
     end 

     function rtn = mysubfunc(arg) 
     disp('mysubfunc'); 
     end 
    end 
end 

缺点是,您需要限定或导入对它们的所有引用,如mystuff.myfunc()。一个“import mystuff。*”可以为班级以外的代码处理这个问题。

import mystuff.* 
myfunc() 
mysubfunc() 

在该类中,函数之间的调用将需要进行限定。 (Matlab的MCOS语法中的大疣,恕我直言)。另外,它们比常规函数有更多的调用开销,所以如果你在紧密循环中调用它们,你的代码会变慢。好处是,现在他们是班级成员,并且可以重构他们以利用私人班级字段和功能等等。

如果你想组织你的代码库,你可以把它们放到一个名字以“+”开头的目录中。相同数量的文件,但至少您的目录有一些结构。

+0

谢谢安德鲁,这看起来像一个干净的解决方案。 – pariser 2011-05-13 21:53:11

1

通过功能手柄进行访问。它可以看作是面向对象仿真(静态方法)。我不建议你使用这种技术

function obj = mainFunc() 
obj.myFunc = @myFunc; 
obj.mySubFunc = @mySubFunc; 
end 

function rtn = myFunc(arg) 
% do some stuff 
end 

function rtn = mySubFunc(arg) 
% do some other stuff 
end 
+1

如你所示的“对象模拟”可能是一个坏主意;但总的来说,我认为将函数句柄返回给子函数对于MATLAB来说是足够合理的事情。 – Edric 2011-05-12 07:34:40

+0

如果你要去解决这个问题,就像上面Andrew所说的那样,制作一个实用课程。 – Marc 2011-05-13 19:29:51

相关问题