【发布时间】:2013-08-17 21:42:38
【问题描述】:
我的一个answers 最近因建议使用cd(path_to_toolbox 而被否决,而不是path 工具之一,例如addpath 或rmpath。鉴于我收到的强烈批评,我必须想象使用path 工具有很好的理由,大概它们在某种程度上更健壮,尤其是当代码分发到其他系统时。
然后我决定记录cd 与addpath 的性能,并惊讶地发现以下结果。在每次试验之前,我都清理了工作区并创建了一个带有交替路径的字符串数组:
clear
clc
p1 = 'c:\MATLAB7\toolbox\symbolic\@sym\';
p2 = matlabroot;
newpath = repmat(' ',100,100);
for ii=1:2:99
newpath(ii,1:length(p1)) = p1;
newpath(ii+1,1:length(p2)) = p2;
end
然后我运行addpath 或cd 如下:
tic
for ii=1:100
addpath(newpath(ii,:))
end
toc
经过的时间是 13.437000 秒。
tic
for ii=1:100
cd(newpath(ii,:))
end
toc
经过的时间是 1.078000 秒。
感谢任何关于是否存在使用 cd 的条件(例如设置函数(工具箱或其他)的路径)的条件。 虽然它可能是被认为草率,我已经使用cd 很多年了,虽然如果重复使用减速可能会很明显,但我发现如果它不在程序的高度迭代部分中使用,减速是值得的它为编码带来的简单性。值得注意的是,addpath 使用起来并不复杂,但现在我似乎有一个真正的理由更喜欢cd:它实际上更快。
编辑
作为这篇文章的附言,我恳求mea culpa 不正当使用cd(在本例中为addpath)。然而,在一种经常用于快速而肮脏的脚本编写的语言中,应该有这样的使用空间。应该记住,matlab 用户的专业知识是有等级的,在某些情况下,不那么“高级”和看似草率的编程技术实际上可以被解释为在短期内是有利的(如果不是长期的话,或版本和目录结构管理可能会出现问题的地方)。
作为附录,我包含一些指向 SO 上的帖子的链接,以及超出该地址的内置函数覆盖、阴影等,其中可以使用 addpath(我也认为 cd):
How to unhide an overriden function?
How to get a handle to an overriden built-in function?
How to wrap an already existing function with a new function of the same name
http://www.mathworks.in/matlabcentral/newsreader/view_thread/264354
【问题讨论】:
-
addpath 不需要你改变当前的matlab 目录,它把它添加到matlab 搜索路径中。假设您在几个不同的文件夹中有文件,那么每次您想使用另一个路径中的函数或类时,都必须更改当前的 matlab 目录……
-
如果附加路径而不是默认前缀会发生什么?不过,您的比较确实很公平。关键是可以设置和保存路径,而每次都需要在脚本中调用
cd(如果您想将用户返回到他们最后的pwd,则需要调用两次)。在某些情况下,cd-ing 可能会破坏内容并导致意外错误,例如,将使用用户pwd中的内容的函数传递给cds 来回传递的主函数。 -
@horchler:你是不是漏掉了一个“NOT”(不公平的比较):)关于追加而不是前置的好点。
-
版本管理也有问题。如果我将具有多个功能的整个程序复制到一个新目录,那么初始 cd 将完成与 addpath 一样多的工作,并且考虑到在这种情况下路径的无常性,任何选择似乎都可以 - 假设所有代码都复制到同一个目录水平。
-
@DennisJaheruddin:很好,MATLAB 也有
genpath函数来生成文件夹及其所有子文件夹的路径字符串,与addpath一起使用