【发布时间】:2011-11-18 13:54:30
【问题描述】:
我在 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,但不能证明重新学习和迁移代码库是合理的——除非它能让我成为一个更快更好的程序员几周内,matlab 专用工具,例如小波和优化工具箱,就可以在 python 中快速轻松地找到或复制。)
【问题讨论】:
-
我觉得这里的答案应该以某种方式涉及“命名空间层次结构”这个词,但我不知道具体如何,因为我不是 csci 专家。
-
现在我已经正确地阐明了这个问题,我开始四处寻找解决方案。 Python modules 似乎有我想要的功能,但我仍然不确定,而且我很确定它们在 matlab 中不存在。
-
在大多数其他语言中,类变量(“成员变量”)被隐式添加到成员函数的名称搜索空间中,因此无需进一步限定即可访问它们。