我想同时使用同一版本的Matlab软件包进行比较测试(比较它们的输出)。该软件包修改了路径,以便在子目录中找到函数。这似乎存在问题,因为该软件包假定自己是在计算机上唯一运行的副本。路径实质上是一个全局变量,不经意间被两个代码副本共享。
示例简化的代码结构:
请注意,somefn.m将submethods目录添加到路径中,并依靠路径调用来自submethods文件夹的代码。
要运行的代码示例:
我能想到的一个解决方案是,每次我想切换到软件包的不同版本时,手动更新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()
,它们只是从路径中删除和添加相关代码。这也清楚地表明了你在脚本中所做的事情,因为相同的函数名称但不同的功能可能在调试时会导致混乱。这是理想的吗?不是。但我猜这也能用。 - Ander Biguri