使用两个版本的Matlab代码 - 如何处理路径?

3
我想同时使用同一版本的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路径。这似乎是不必要的编码开销,并且潜在地会导致性能问题(由于频繁切换路径)。
另一个解决方案可能是将代码重写为面向对象,以便函数附加到对象上,我可以创建不同版本的对象。但实际上,该代码包含数百个文件,而且我不是原始作者,因此重写将是一项巨大的任务。
(还有另一种选择是一直更改目录,以使要运行的代码始终在当前目录中。由于子文件夹数量众多,这将带来很多麻烦,我认为这不是一个可行的解决方案。它也存在潜在的性能开销缺点,类似于总是更改路径。)
有没有更简洁的方式来处理这个问题?我能否以某种方式指定要运行的代码文件夹?设计这样一个代码包的最佳方式是什么,以避免出现这个问题?

3
过去在一个像你这样的比较项目中,我有两个函数 useToolA()useToolB(),它们只是从路径中删除和添加相关代码。这也清楚地表明了你在脚本中所做的事情,因为相同的函数名称但不同的功能可能在调试时会导致混乱。这是理想的吗?不是。但我猜这也能用。 - Ander Biguri
2
我同意Ander的观点。你需要更改MATLAB路径。在MATLAB中没有更好的方法来做这件事。如果他们正确地实现了命名空间,我们就可以在命名空间下安装工具箱,但是在当前的实现中,如果不更新工具箱内所有调用工具箱函数的调用,这是行不通的(!!!)。 - Cris Luengo
2
如果您的MATLAB版本足够新,支持项目功能,那么您可能会发现它非常有用,因为它可以为您处理一些路径管理。或者,您可以使用测试框架在具有特定路径的环境中运行代码。 - Wolfie
2个回答

0

只需创建包,其中可以包含具有相同名称的函数:创建命名空间的包

基本上创建两个名为+package1和+package2的文件夹。文件夹名称中的“+”很重要。然后将您的函数放置在它们下面,例如foo.m。然后,您可以分别调用每个函数,而不会干扰MATLAB路径:

>> package1.foo
>> package2.foo

2
不幸的是,这并不起作用,因为现在工具箱内所有工具箱函数的调用都必须进行装饰。如果函数 foo 在同一工具箱内调用函数 bar,则此调用现在已经失效,并且必须重写为 package1.bar。这正是我在我的早期评论中所说的。 - Cris Luengo

0

你可以使用 私有函数。将目录结构更改为:

/main_code.m
/compare_results.m
/+code_a/somefn.m
/+code_a/private/
/+code_b/somefn.m
/+code_b/private/

每个somefn都可以访问其私有子文件夹中包含的函数。因此,无需创建全局变量并将私有子文件夹添加到路径中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接