rlb*_*ond 53 matlab namespaces
我的实验室里有很多MATLAB代码.问题是没有办法组织它.由于所有函数都必须在同一个文件夹中调用(或者你必须在MATLAB的path
环境变量中添加一堆文件夹),似乎我们注定在同一个文件夹中有大量文件,全都在全局命名空间.有没有更好的方法来组织我们的文件和功能?我真的希望有某种模块系统......
kwa*_*ord 71
MATLAB有一个可以嵌套的包的概念,包括类和函数.
只需在你的路径上的某个地方创建一个目录+
,就像第一个字符一样+mypkg
.然后,如果该目录中有类或函数,则可以将其称为mypkg.mything
.您也可以使用包导入import mypkg.mysubpkg.*
.
关于将一堆函数移动到包中的一个主要问题是函数和类不会自动导入它们所在的包.这意味着,如果你有一大堆的相互调用不同的m文件的功能,你可能要花费一段时间下跌import
S IN或资格函数调用.不要忘记将导入放入调用的子函数中.更多信息:
http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html
我没有看到必须在Matlab的搜索路径中添加一些文件夹的问题.我已经修改,startup.m
以便它在我的Matlab启动目录中递归查找目录,并将它们添加到路径中(它也可以svn update
在所有内容上运行).这样,如果我改变了目录结构,Matlab在下次启动时仍然会看到所有的功能.
否则,您可以查看面向对象的代码,将所有方法存储在@objectName文件夹中.但是,这可能会导致大量重写代码,可以通过更新路径来避免(add with subfolders
如果将文件夹添加到File
菜单中的路径,甚至还有一个按钮)并执行一些移动代码.
编辑
如果您想组织代码,以便某些函数仅对直接调用它们的函数可见(如果您不想在OOP中重写),则将调用函数放在目录中,并在此目录中在目录中,您创建一个名为的子目录private
.其中的函数只对父目录中的函数可见.如果你必须为代码的一个子集重载一些内置的Matlab函数,这非常有用.
包装系统可能是最好的.我使用类系统(@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"目录结构,您可以在其中使用不同的实验室成员来保存他们正在处理的代码.这样,如果需要,您可以访问他们的代码,但是当他们编写与您的代码同名的函数时,不会被破坏.