2017-08-17 15 views
0

makeを使って数値実験を自動化します。多くの場合、複数のパラメータに依存するデータをシミュレートする必要があります。GNU makeネストジェネリックルール

例えば、私はパラメータとして再構成画像のサイズを、ノイズレベルを別のものとして、また再構成アルゴリズムを第3のパラメータとして有することができる。

具体的には、データの10%と5%の相対誤差から512x512と1024x1024の画像を再構成したい場合がありますが、4つのケースはすべてFISTAアルゴリズムとISTAアルゴリズムで行う必要があります。

私は、%、$ @、$ *のパターンを使用して、1つのパラメータしか関与していないときに必要なものを得る方法を知っています。したがって、いくつかのエラーレベルでFISTAを使用して1024x1024画像の結果を得ることは簡単です。

しかし、どのように入れ子にするのですか?

+0

パターンルールは、パラメータがターゲットの名前にある場合に便利です。しかし、なぜそれらを変数として持つべきではないのでしょうか?これは、ソリューションをよりきれいにします。 – Beta

+0

私は1つのルールしか書いていないので、構築プロセスはすべての実験で同じですので、ルール全体をコピーして変数を変更するのは苦痛です。それらを変数として持つことは、それを助けることはできません。 – Elias

+0

私はあなたが誤解していると思います。 'Make ImageA66_512_RE10_ISTA'の代わりに' ImageA66 SIZE = 512RE = 10 ALG = ISTA'を作ることができます。 1つの簡単なルールがすべてのケースをカバーします。それは満足するでしょうか? – 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

関連する問題