2017-02-15 16 views
0

私は当初、ループをネストしたforループを使用する必要がある問題を扱っています。私は多数のforループを1つに結合する方法があるかどうか疑問に思っていました。複数のforループを1つにまとめる

これを追加するには、答えがhereであることが判明しましたが、可能なすべての組み合わせを最初に生成する必要があります。これはメモリ要件が悪い可能性があります。私は、私が使用する必要がありますどのように多くの変数を事前に知っていれば、これを作るための方法がある

for x1 = 1:10 
    for x2 = 2:15 
     for x3 = 3:5 
      for x4 = 7:9 
       %and so on 
       cost = J(x1, x2, x3, x4) %or more 
      end 
     end 
    end 
end 

:私のforループは、次のようなコスト関数が評価されると、互いに独立した多くの変数、で構成され簡単にブロックできますか?

+6

であなたの計算を開始することができます

function loop(f, args, varargin) if ~isempty(args) for arg = args{1} loop(f, args(2:end), varargin{:}, arg); end else f(varargin{:}); end 

元のコード*その後、遅くなります。ネストされたループを単一のものにする一般的な方法があった場合、最初からネストされたループはありません。また、不必要な書式作成を避けるようにしてください。 –

+3

私の前のコメントに追加する。ほぼすべてのコード最適化は、メモリと計算時間の間の弱いバランスに依存します。一般的には1つを選択する必要があり、もう1つが悪化する可能性が高いことに注意してください。 –

+2

もう1つの方法はベクトルを受け入れてn-dim(nは可変の与えられた数)テンソルを返すように 'J()'を修正することですが、それもメモリと時間のバランスに戻ります。 – mpaskov

答えて

1

次の関数は、仕事をしていませんが、それはそれが何をするかにあなたが依存するループ*を最適化することができ

loop(@J, {1:10, 2:15, 3:5, 7:9}); 
+0

それは私のコードを遅くするかもしれませんが、それは非常にきちんとした解決策です、私はこの答えを受け入れています。 – nikaltipar

関連する問題