は、私は完全に4D配列を移入するためにそれを使用していこのループで順列対称性を利用する方法は?
f(a,b,c,d) = f(c,d,a,b) = -f(b,a,d,c) = -f(d,c,b,a)
次順列対称性を持つスカラー関数f(a,b,c,d)
を持っています。作品の下にこのコード(のpython/numpyのを使用して):
A = np.zeros((N,N,N,N))
for a in range(N):
for b in range(N):
for c in range(N):
for d in range(N):
A[a,b,c,d] = f(a,b,c,d)
しかし、明らかに、私はこのコードのセクションの実行時間を削減するために対称性を利用したいと思います。私は試しました:
A = np.zeros((N,N,N,N))
ab = 0
for a in range(N):
for b in range(N):
ab += 1
cd = 0
for c in range(N):
for d in range(N):
cd += 1
if ab >= cd:
A[a,b,c,d] = A[c,d,a,b] = f(a,b,c,d)
実行時間を半分に短縮します。しかし、最後の対称性のために私が試した:動作しますが、2スピードアップのもう一つの要因に近い私を与えるものではありません
A = np.zeros((N,N,N,N))
ab = 0
for a in range(N):
for b in range(N):
ab += 1
cd = 0
for c in range(N):
for d in range(N):
cd += 1
if ab >= cd:
if ((a >= b) or (c >= d)):
A[a,b,c,d] = A[c,d,a,b] = f(a,b,c,d)
A[b,a,d,c] = A[d,c,b,a] = -A[a,b,c,d]
を。私は正当な理由でそれが正しいとは思わないが、理由を見ることはできない。
ここで、この特定の順列対称性をより良く活用するにはどうすればよいですか?
@EricDuminilおっとにあります。 'cd'は複合インデックスであり、' c'と 'd'ループの後に1だけインクリメントされるべきです。良いキャッチ。一定。 – jjgoings
あなたのコードで、またはちょうど質問でそれを忘れましたか? –
np.fromfunction()を使用して座標を取得し、それらのポイントで関数を評価すると、あなたの関数が** 2 + b ** 2 + c ** 2 + d ** 2(あなたの順列対称関数)を使用すると、A = np.fromfunction(λi、j、k、m:i ** 2 + j ** 2 + k ** 2 + m ** 2、(N、N、 N、N)) – plasmon360