罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

当MATLAB刷新目录时

多年来,有很多关于MATLAB何时识别文件的问题路径.今天我将讨论用户生成或更新MATLAB代码,然后想要使用它的情况。你要怎么做才能确保MATLAB能看到它?我特别讨论的是用户目录中的用户文件,而不是下面的文件matlabroot

内容

函数fcnPuzzle ()

注意:我正在做一个实验,通过发布带有子函数的函数,这样您就可以看到带有语法高亮显示的代码,而不是博客代码本身。我希望这最终能起作用并有所帮助。

困惑的密码

看函数fcnBug在这篇文章的底部。一个难题是,如果从调试器运行代码,结果总是预期的结果,但当以通常的方式运行时就不是这样了。我将通过几种不同的方式来演示这个难题。请参见修复版fcnBugRepair遵循bug版本。

显示文件不存在。

存在(“fcnTest.m”“文件”)
Ans = 0

小谜题。如果我没有在文件存在之前将第一次尝试放入try - catch,我的函数失败与一个错误。但是,如果我把相同的代码放在try - catch时,似乎不会产生错误。今天就让我们忽略这个谜吧。

试一试fcnBug (“C”“清楚”)ignoreException disp (运行前文件不存在时出现错误)结束

只调用写入的原始函数,而不调用更新的版本,假设我们在函数中不做任何其他事情来影响工作空间。

fcnBug(num2str(d)),“什么”)结束
1问题1问题1问题1问题

在调用函数之前清除该函数会有所帮助。

fcnBug(num2str(d)),“清楚”)结束
1问题2问题3问题4问题

影响MATLAB查看新函数的另一种方法是询问文件是否存在

删除fcnTest.md = 1:4 fcnBug (num2str (d),“清楚+存在”)结束
1问题2问题3问题4问题

清理。

删除fcnTest.m

解决问题

有一个简单的解决方案来确保新文件被识别。关闭文件后,直接强制MATLAB清除内存中的文件。根据你的情况,你可以用更轻或更重的手来做这件事。简单的清算这个函数就足够了,或者你可以试试重新处理MATLAB知道的文件。

试一试fcnBugRepair (“C”“清楚”)ignoreException disp (运行前文件不存在时出现错误)结束
运行前文件不存在时出错

我来演示一下如何使用修复函数。在前面的情况中,只有最初写入的文件被调用。在这里可以看到,现在执行了每个版本,即使没有做任何额外的事情(除了添加清晰的函数代码中的语句)。

fcnBugRepair(num2str(d),“什么”)结束
1问题2问题3问题4问题

和以前一样,在执行前清理工作空间仍然有很好的效果。

fcnBugRepair(num2str(d),“清楚”)结束
1问题2问题3问题4问题

同样,函数存在性的测试也有效。

删除(“fcnTest.m”);d = 1:4 fcnBugRepair (num2str (d),“清楚+存在”)结束
1问题2问题3问题4问题

清理

删除fcnTest.m

为什么这个解决方案有效?

问题在于文件的时间戳分辨率,在大多数文件系统上只有1秒。由于这是在一个紧密循环中运行,文件fcnTest.m在同一时间内被重写,因此MATLAB无法知道它已经改变了。因此,MATLAB最初继续使用缓存版本。

清晰的迫使MATLAB转储它的缓存,下一次MATLAB运行该函数时,它会从磁盘重新加载它。

的函数存在而且重新处理它们都会使MATLAB注意到文件的变化,因为它们都会刷新“脏”目录。

MATLAB不总是寻找变化的原因是为了性能。文件关闭会通知路径管理器某个目录被更改,但缓存更新不会发生,直到有人显式地刷新目录——刷新可以以我已经讨论过的方式发生,或者在下一个命令提示符发生(这就是为什么它在调试器中工作)。

原始的函数

函数fcnBug(id, mode)
% fcnBug -意外的错误%%% %错误当运行前文件不存在时,% %% fcnBug('C', 'clear')仅“基本工作区1”% %被调用%, d=1:4% fcnBug(num2str(d), 'nothing')%结束%% %清空工作区% %帮助%, d=1:4% fcnBug(num2str(d), 'clear')%结束%% %在创建时没有% delete('fcnTest.m');% fcnBug(num2str(1), 'clear')%% %存在% %似乎告诉MATLAB函数在这里% delete('fcnTest.m');%, d=1:4% fcnBug(num2str(d), 'clear+exist')%结束Fid = fopen(”。\ fcnTest.m '' w ');流(fid检测器,'function fcnTest(varargin)\ndisp(" %s Problem ")'、身份证);文件关闭(fid);开关低(模式)情况下“清楚+存在”清晰的fcnTest存在(“fcnTest.m”“文件”);情况下“清楚”清晰的fcnTest情况下“什么”结束fcnTest;
运行前文件不存在时出错

修复功能

函数fcnBugRepair(id, mode)在一个好的位置添加明确的声明修复Fid = fopen(”。\ fcnTest.m '' w ');流(fid检测器,'function fcnTest(varargin)\ndisp(" %s Problem ")'、身份证);文件关闭(fid);清晰的fcnTest%或者可以在这里使用rehash代替开关低(模式)情况下“清楚+存在”清晰的fcnTest存在(“fcnTest.m”“文件”);情况下“清楚”清晰的fcnTest情况下“什么”结束fcnTest;




使用MATLAB®7.7发布


评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。