我在MATLAB中进行科学图像处理,这需要解决许多参数的奇怪优化问题,这些参数由“实验”函数使用,该函数具有使用各种参数子集的许多不同“辅助函数”.传递这些参数是一件痛苦的事情,我想要一个优雅的可扩展解决方案.
我首选的解决方案是“相对全局”变量 – 对于“主”函数的工作空间是通用的,以及主函数调用并指定他们想要共享该变量的任何子函数.但是相对全局变量不会在声明它的函数之外存在,并且一旦主函数返回就会消失.
代码看起来像这样,除了会有更多的experiment_helpers,每个都以不同的方式使用参数:
function y = experiment(p1,p2,p3,...)
% declare relative global variables.
% these will not change value within this experiment function,
% but this experiment will be reused several times in the calling function,
% each time with different parameter values.
relative global p1, p2, p3 ...
% load and process some data based on parameters
...
% call the helper + return
y = experiment_helper(y,z);
end
function y = experiment_helper(y,z)
relative global p1, p3
%% do some stuff with y, z, possibly using p1 and p3, but not changing either of them.
...
end
我意识到你可以通过其他几种方式获得所需的行为 – 你可以将参数传递给实验调用的子函数,你可以将参数放在参数结构中并将它们传递给子函数,等等上.第一个是可怕的,因为每次我想改变参数的使用时我都要改变所有子功能的参数.第二个没关系,但每次我想使用变量时都必须包含结构前缀.
我认为我的问题的“正确”解决方案是使用选项结构,就像matlab在自己的优化代码中所做的那样.我只是想知道是否每次我想使用参数“value”时都没有让我输入“paramStruct.value”的方式.
我意识到相对全局变量可能导致各种调试噩梦,但我认为它们不一定比现有全局变量引起的更糟糕.并且它们至少比不合格的全局变量具有更多的局部性.
那么真正的程序员如何处理这个问题呢?是否有针对此类问题的优雅,易于创建和维护的设计?可以在matlab中完成吗?如果没有,你会用另一种语言做到这一点? (我总是对使用matlab感到内疚,因为它并不能完全鼓励好的设计.我总是想切换到python,但不能证明重新学习东西和迁移代码库 – 除非它会让我成为一个更快更好的程序员在几周之内,可以在python中快速找到或复制特定于matlab的工具,例如小波和优化工具箱.)