2

Mathematica でプログラミングしていますが、複数の for ループを回避しようとしています。

n を与えられた整数とし、n-タプルを取る fa 関数とします。制限された k を考慮して、各エントリの範囲が -k から k までのすべての n タプルをループする効率的な方法を探しています。(n-タプルを f に差し込むことになります。)

Mathematica の関数 Tuples[Range[-k,k],n] を試してみましたが、n を 8、10、または 15 程度にしたいことがよくあります。少なくとも 4 または 5) (2k+1)^n タプルを保持しようとしてメモリが不足します。

私はもともと n for ループを使用していましたが、うまくいきました。n を変化させたいのですが、n ごとに手動でコードを挿入し続けることはできません。

あなたが与えることができる助けとアドバイスをありがとう!

4

2 に答える 2

0

これは、ネストされたループをプログラムで構築する方法です。

ftup[tup_] := Print[tup]
n = 2
k = 1
Do @@ Join[{Unevaluated[ftup[Array[ a, n]]]}, 
      Table[ { a[i], -k, k } , {i, n }]]

これは、組み込みのタプルを複製していることを示しています。

ftup[tup_] := Sow[tup];
n = 6;
k = 3;
Last@Last@Reap[ Do @@ 
 Join[{Unevaluated[ftup[Array[ a, n]]]},Table[ { a[i], -k, k } , {i, n }]]  ]
    ==  Tuples[ Range[-k, k] , {n}]
于 2013-06-26T21:08:02.370 に答える
0

必要なループは 1 つだけだと思います。必要なすべてのタプルを出力するものを次に示します。

With[{k = 2, n = 3}, Do[Print[IntegerDigits[i, 2 k + 1, n] - k], {i, 0, (2 k + 1)^n - 1}]];
于 2013-06-30T15:41:07.483 に答える