我在MATLAB中做了科學圖像處理,它需要解決奇怪的優化問題,許多參數被「實驗」函數使用,該函數有許多不同的「輔助函數」參數的子集。傳遞這些參數是件痛苦的事情,我想要一個優雅的可擴展解決方案。matlab或其他語言中的「相對全局」變量
我的首選解決方案是一個「相對全局」變量 - 對於「main」函數的工作空間是常見的,以及主函數調用並指定他們想要共享該變量的任何子函數。但是相關的全局變量不會在聲明它的函數外部存在,並且一旦主函數返回就會消失。
的代碼是這樣的,除了會有更多的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專家。 – Paul
現在我已經正確地闡述了這個問題,我已經開始尋找解決方案。 [Python模塊](http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-created-them/423668#423668)似乎有我希望的功能,但我仍然不確定,我很確定它們不存在於matlab中。 – Paul
在大多數其他語言中,類變量(「成員變量」)隱式添加到成員函數的名稱搜索空間中,因此可以在沒有進一步限定的情況下訪問它們。 –