【问题标题】:Is there any way to call a MATLAB "subfunction" from the outside the file? [duplicate]有没有办法从文件外部调用 MATLAB“子函数”? [复制]
【发布时间】:2011-05-12 05:34:17
【问题描述】:

可能重复:
Is it possible to define more than one function per file in MATLAB?

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

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

AFAIK,在 subfunc.m 文件之外的任何地方执行都无法访问 mysubfunc。我一直并且继续对 MATLAB (R2010b) 中的这个小特性感到恼火。我错了吗 - 是否有 任何 方法可以从 myfunc.m 外部调用 mysubfunc

更新: 新问题:有什么好的方法可以做到这一点吗?还是我真的应该忍气吞声,继续制作更多文件?

【问题讨论】:

  • 不,你必须接受它。我使用半命名空间方法来减少混乱并鼓励我重用自己的代码(例如,在项目“heatflux”中,我将使用 hf_ 开始所有函数名)。
  • 您的目标是什么?您是否只想减少将每个函数放在单独文件中的混乱情况?
  • 如果你需要在 myfunc 之外访问 subfunc,那么几乎按照定义,它不应该是一个子函数。应为仅与封闭函数上下文相关的通用功能保留子函数。
  • 我们的目标是确实减少混乱(文件数量和认知单位)。我正在以数字方式解决一个问题,并且有一组不同的可能迭代方案,它们都采用相同的输入并产生相同的输出。以前,正在运行 iterate 函数并切换哪个迭代方案,但 classdef 是一个非常干净的解决方案。想要在文件外部运行子功能以进行测试,同时快速制作新方法的原型。

标签: function matlab file function-pointers


【解决方案1】:

您可以在实用程序类上将它们全部设为静态方法。这些函数可以通过名称全局引用,但您只需要管理一个 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 语法中的大缺陷,恕我直言。)此外,它们将比常规函数具有更多的调用开销,因此如果您在紧密循环中调用它们,您的代码会变慢。从好的方面来说,现在它们是类成员,您可以重构它们以利用私有类字段和函数等。

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

【讨论】:

  • 感谢 Andrew,这看起来是一个干净的解决方案。
【解决方案2】:

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

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

【讨论】:

  • "Object emulation" 如您所见,可能是个坏主意;但总的来说,我认为在 MATLAB 中将函数句柄返回给子函数是一件足够合理的事情。
  • 如果您要解决这个问题,只需创建一个实用程序类,就像上面 Andrew 所说的那样。
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多