2010-04-30 63 views
47

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

+1

另请参见http://stackoverflow.com/questions/2326609/how-to-organize-matlab-code – 2010-05-01 00:38:15

回答

64

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

只要在+的第一个字符(如+mypkg)的路径上的某个地方制作目录。然后,如果该目录中存在类别或功能,则可以将其称为mypkg.mything。您也可以使用import mypkg.mysubpkg.*从包中导入。

关于将一堆函数移动到一个包中的一个主要问题是函数和类不会自动导入它们所在的包,它们的编号为。这意味着如果你有一堆函数在不同的m文件中互相调用,你可能不得不花费一些时间在函数调用中调用import。不要忘记把导入到子功能,并呼吁。更多信息:

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

+8

哦。我的。天哪。为什么没有人告诉我这件事?谢谢! – rlbond 2010-05-01 06:50:04

+1

为了回答这个原因,这是因为有很多人使用老版本的MATLAB,而这只是新版本的一个特性。 – 2010-07-29 02:18:27

+0

什么是具有此功能的最老版本的matlab? – Memming 2012-08-02 15:54:13

8

我没有看到必须添加一些文件夹到Matlab的搜索路径的问题。我修改了startup.m,以便递归查找我的Matlab启动目录中的目录,并将它们添加到路径中(它也对所有内容运行svn update)。这样,如果我改变目录结构,Matlab仍然会在下次启动它时看到所有的功能。否则,您可以查看面向对象的代码,将所有方法存储在@objectName文件夹中。但是,这可能会导致许多重写代码,通过更新路径可以避免(如果将文件夹添加到File菜单的路径中,甚至有一个按钮add with subfolders),并执行一些移动代码。

编辑

如果你想组织你的代码,使一些功能只对那些直接调用这些功能可见(如果你不想重新写于OOP),你将调用函数放在一个目录中,并在该目录中创建一个名为private的子目录。那里的函数只对父目录中的函数可见。如果您必须为一部分代码重载一些内置的Matlab函数,这非常有用。

+2

我的问题是,所有的功能都在全局命名空间,即没有办法调用函数' subfolder1 \ myFunc(1,2,3)' – rlbond 2010-05-01 00:57:06

+2

如果要隐藏全局名称空间中的函数,可以使用'private'文件夹。请参阅编辑。 – Jonas 2010-05-01 01:58:33

6

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

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

5

包系统可能是最好的。我使用类系统(@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”目录结构,其中您有不同的实验室成员保存代码他们正在努力。这样,如果你需要它,你可以访问他们的代码,但是当他们写一个和你自己的名字相同的函数时不会被破坏。

相关问题