【发布时间】:2021-06-21 00:00:31
【问题描述】:
我想同时使用同一个 Matlab 软件包的两个版本(我想比较它们的输出进行测试)。该包修改了路径,以便可以找到子目录中的函数。这似乎有问题,因为包假定它是机器上运行的唯一副本。路径本质上是一个全局变量,在两个代码副本之间无意共享。
示例简化代码结构:
/main_code.m
/compare_results.m
/code_a/somefn.m
/code_a/submethods/
/code_b/somefn.m
/code_b/submethods/
注意 somefn.m 将 submethods 目录添加到路径中,并依赖路径从 submethods 文件夹中调用代码。
我想运行的代码示例:
for i = 1:1000000
% Run version A:
result_a = code_a.somefn(i);
% Run version B:
result_b = code_b.somefn(i);
% Compare the output from the two versions:
compare_results(a,b);
end
我能想到的一个解决方案是每次我想切换到不同版本的包时手动更新 Matlab 路径。这似乎是不必要的编码开销,并且可能是性能问题(由于经常切换路径)。
另一种解决方案可能是将代码重写为面向对象,以便将函数附加到对象,并且我可以创建不同版本的对象。这样做的问题是,实际上代码包包含数百个文件,而我不是原作者,因此重写将是一项艰巨的任务。
(另一种选择是始终更改目录,以便要运行的代码始终在当前目录中。由于子文件夹的数量,我认为这不是一个严肃的解决方案。它还具有类似于总是改变路径的潜在性能开销缺点。)
有没有更简洁的方法来处理这个问题?我可以以某种方式指定要运行的代码的文件夹吗?怎样设计这样的代码包才不会出现这个问题?
【问题讨论】:
-
是的,在过去,对于像您这样的比较项目,我有两个函数
useToolA()和useToolB(),它们只是从路径相关代码中删除和添加。它还清楚地说明了您在脚本中所做的事情,因为相同的函数名称但不同的功能可能是调试时疯狂的根源。这是理想的吗?不。但我猜是可行的。 -
我同意安德的观点。您需要更改 MATLAB 路径。在 MATLAB 中没有更好的方法可以做到这一点。如果他们正确地实现了命名空间,我们就可以在命名空间下安装工具箱,但是对于当前的实现,如果不更新工具箱本身内对工具箱函数的所有调用,这将无法工作(!!!)。
-
如果您有足够新的 MATLAB 版本来支持它们,您可能会发现 Projects 很有用,它们会为您处理一些路径管理。或者,您可以使用testing framework 在具有特定路径的环境中运行代码