Function 有没有办法从文件外部调用MATLAB“子函数”?

Function 有没有办法从文件外部调用MATLAB“子函数”?,function,matlab,file,function-pointers,Function,Matlab,File,Function Pointers,可能重复: 为了在MATLAB中定义一个非匿名函数,需要创建一个与函数同名的文件;e、 例如,可以在文件myfunc.m中定义一个名为myfunc的函数,如下所示: 假设在同一个文件myfunc.m中,我还有一个子函数,如中所示 function rtn = myfunc(arg) % do some stuff end function rtn = mysubfunc(arg) % do some other stuff end 顺便说一句,在subfunc.m文件之外的任何地方执行my

可能重复:

为了在MATLAB中定义一个非匿名函数,需要创建一个与函数同名的文件;e、 例如,可以在文件myfunc.m中定义一个名为myfunc的函数,如下所示:

假设在同一个文件myfunc.m中,我还有一个子函数,如中所示

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

function rtn = mysubfunc(arg)
% do some other stuff
end
顺便说一句,在subfunc.m文件之外的任何地方执行mysubfunc都无法访问。MatlabR2010B中的这一小特性一直困扰着我,我也将继续困扰着我。我错了吗?有没有办法从myfunc.m之外调用mysubfunc


更新:新问题:有什么好方法可以做到这一点吗?或者我真的应该接受它并继续制作更多文件吗?

通过函数句柄访问。它可以看作是面向对象仿真的静态方法。不过,我不建议您使用这种技术

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

您可以在一个实用程序类上创建所有静态方法。这些函数可以通过名称进行全局引用,但您只需要管理一个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。导入mystuff.*可以为类外的代码处理此问题

import mystuff.*
myfunc()
mysubfunc()
在类中,函数之间的调用需要限定。Matlab的MCOS语法中的一个大毛病,IMHO。而且,它们的调用开销比常规函数要大,所以如果在紧密循环中调用它们,代码的速度会变慢。好的方面是,现在它们是类成员,您可以重构它们以使用私有类字段和函数等等


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

不,你必须接受它。我使用半名称空间的方法来减少混乱,并鼓励我重用自己的代码,例如,在“heatflux”项目中,我将以hf_3;开始所有函数名。您的目标是什么?你只是想减少将每个函数放在一个单独的文件中造成的混乱吗?如果你需要在myfunc之外访问subfunc,那么根据定义,它不应该是一个子函数。子函数应该保留给只与封闭函数上下文相关的公共功能。目标是减少文件数量和认知单元的混乱。我在用数值方法解决一个问题,有一系列不同的可能的迭代方案,它们都接受相同的输入,产生相同的输出。以前,我们运行一个迭代函数并切换哪个迭代方案,但是classdef是一个非常干净的解决方案。想要在文件外运行子函数以进行测试,同时快速创建新方法的原型;但总的来说,我认为在MATLAB中,将函数句柄返回给子函数是一件非常合理的事情。如果遇到这种麻烦,只需创建一个实用类,就像上面Andrew所说的。谢谢Andrew,这看起来是一个干净的解决方案。
import mystuff.*
myfunc()
mysubfunc()