2017-08-17 60 views
0

我使用make來自動化數值實驗。通常情況下,我必須模擬依賴於多個參數的數據。GNU make嵌套泛型規則

例如,我可能會將重建圖像的大小作爲參數,將噪聲級別作爲另一個參數,將重建算法作爲第三個參數。

作爲一個具體的例子,我可能希望重建512x512和1024x1024數據中10%和5%的數據相對誤差,所有這四種情況都應該用FISTA和ISTA算法來完成。

我知道如何使用含有%,$ @和$ *的模式,以便在只涉及一個參數時獲得我想要的模式。因此,使用FISTA可以很容易地獲得用於多個錯誤級別的1024x1024圖像的結果。

但我怎麼窩?

+0

當參數在目標名稱中時,模式規則很有用。但爲什麼不把它們作爲變量?它使解決方案更加清潔。 – Beta

+0

因爲我只想寫一條規則,所以每個實驗的構建過程都是一樣的,因此複製整個規則並更改變量是一種痛苦。將它們作爲變量無法幫助解決這個問題。 – Elias

+0

我想你誤會了。您可以使ImageA66 SIZE = 512 RE = 10 ALG = ISTA而不是使用ImageA66_512_RE10_ISTA。一個簡單的規則涵蓋所有情況。這會滿足嗎? – Beta

回答

1

如果你想要的東西(不是100%確定)是遍歷所有可能的情況下,如果推出了各種情況下的命令是:

echo simulate SIZE RELATIVE_ERROR ALGORITHM 

那麼你可以嘗試這樣的:

# sizes 
S := 512 1024 
# relative errors 
E := 5 10 
# algorithms 
A := FISTA ISTA 
# targets 
T := 

.PHONY: all 
.DEFAULT_GOAL := all 

# $(1): size, $(2): error, $(3): algo 
define MY_rule 
T += $(1)-$(2)-$(3) 
.PHONY: $(1)-$(2)-$(3) 

$(1)-$(2)-$(3): 
    @echo simulate $(1) $(2) $(3) 
endef 

$(foreach s,$(S),$(foreach e,$(E),$(foreach a,$(A),$(eval $(call MY_rule,$(s),$(e),$(a)))))) 

all: $(T) 

它利用了先進的GNU make功能foreach-eval-call組合。 This other answer詳細解釋它。

+0

我會嘗試它,並會給你反饋。看起來很像我想要的東西。 – Elias

+0

是的,就是這樣。非常感謝! – Elias