MATLAB与命名空间最接近的是什么?

rlb*_*ond 53 matlab namespaces

我的实验室里有很多MATLAB代码.问题是没有办法组织它.由于所有函数都必须在同一个文件夹中调用(或者你必须在MATLAB的path环境变量中添加一堆文件夹),似乎我们注定在同一个文件夹中有大量文件,全都在全局命名空间.有没有更好的方法来组织我们的文件和功能?我真的希望有某种模块系统......

kwa*_*ord 71

MATLAB有一个可以嵌套的包的概念,包括类和函数.

只需在你的路径上的某个地方创建一个目录+,就像第一个字符一样+mypkg.然后,如果该目录中有类或函数,则可以将其称为mypkg.mything.您也可以使用包导入import mypkg.mysubpkg.*.

关于将一堆函数移动到包中的一个主要问题是函数和类不会自动导入它们所在的包.这意味着,如果你有一大堆的相互调用不同的m文件的功能,你可能要花费一段时间下跌importS IN或资格函数调用.不要忘记将导入放入调用的子函数中.更多信息:

http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html

  • 哦.我的.天哪.为什么没有人告诉我这件事?谢谢! (9认同)
  • @Memming我相信它是2008a,这是添加新风格的面向对象功能的时候. (3认同)

Jon*_*nas 9

我没有看到必须在Matlab的搜索路径中添加一些文件夹的问题.我已经修改,startup.m以便它在我的Matlab启动目录中递归查找目录,并将它们添加到路径中(它也可以svn update在所有内容上运行).这样,如果我改变了目录结构,Matlab在下次启动时仍然会看到所有的功能.

否则,您可以查看面向对象的代码,将所有方法存储在@objectName文件夹中.但是,这可能会导致大量重写代码,可以通过更新路径来避免(add with subfolders如果将文件夹添加到File菜单中的路径,甚至还有一个按钮)并执行一些移动代码.

编辑

如果您想组织代码,以便某些函数仅对直接调用它们的函数可见(如果您不想在OOP中重写),则将调用函数放在目录中,并在此目录中在目录中,您创建一个名为的子目录private.其中的函数只对父目录中的函数可见.如果你必须为代码的一个子集重载一些内置的Matlab函数,这非常有用.

  • 我的问题是所有函数都在全局命名空间中,即没有办法调用函数`subfolder1\myFunc(1,2,3)` (2认同)
  • 如果要隐藏全局命名空间中的函数,可以使用`private`文件夹.见编辑. (2认同)

Mar*_*arc 8

组织和重用代码的另一种方法是使用matlab的面向对象的功能.每个对象通常位于以"@"开头的文件夹中,并且内部包含该类的文件.(虽然较新的语法不需要在单个文件中定义的类.)在类文件夹中使用私有文件夹,matlab甚至支持私有类成员.Matlab的新类符号功能相对较全,但即使是旧的语法也很有用.

顺便说一句,我startup.m检查了一个众所周知的位置,我将我的SVN签出进入,并自动将所有子文件夹添加到我的路径中.


Mar*_*arc 6

包装系统可能是最好的.我使用类系统(@ClassName文件夹),但实际上我写了对象.如果你不这样做,那么编写一堆静态方法真是太愚蠢了.有一点可能有用的是将所有matlab代码放入不在matlab路径上的文件夹中.然后,您可以有选择地只添加路径所需的代码.

所以说你有两个项目,存储在"c:\ matlabcode\foo"和"c"\ matlabcode\bar"中,两者都使用存储在"c:\ matlabcode\common"中的常用代码,你可能有一个函数"setupPaths .m"像这样:

function setupPaths(projectName)
basedir = fullfile('c:', 'matlabcode');
addpath(genpath(fullfile(basedir, projectName)));
switch (projectName)
   case {'foo', 'bar'}
       addpath(genpath(fullfile(basedir, 'common')));
end
Run Code Online (Sandbox Code Playgroud)

当然你可以扩展它.一个明显的扩展是在每个目录中包含一个文本文件,说明应该在路径中添加其他目录以使用该目录中的函数.

如果您共享代码,另一个有用的事情是设置"用户特定/ LabMember"目录结构,您可以在其中使用不同的实验室成员来保存他们正在处理的代码.这样,如果需要,您可以访问他们的代码,但是当他们编写与您的代码同名的函数时,不会被破坏.