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

时间:2010-04-30 23:58:11

标签: matlab namespaces

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

4 个答案:

答案 0 :(得分:69)

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

只需在路径的某个位置创建一个目录,其中+作为第一个字符,例如+mypkg。然后,如果该目录中有类或函数,则可以将其称为mypkg.mything。您也可以使用import mypkg.mysubpkg.*从包中导入。

关于将一堆函数移动到包中的一个主要问题是函数和类不会自动导入它们所在的包。这意味着如果你在不同的m文件中有一堆函数相互调用,你可能需要花一些时间来放入import或限定函数调用。不要忘记将导入放入调用的子函数中。更多信息:

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

答案 1 :(得分:9)

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

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

修改

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

答案 2 :(得分:8)

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

BTW,我的startup.m检查我执行SVN检出的知名位置,并自动将所有子文件夹添加到我的路径中。

答案 3 :(得分: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

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

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