는 내가 완전히 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)
있습니다. 작품 아래에이 코드 (파이썬/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)
실행 시간을 절반으로 줄였다. 그러나 지난 대칭 나는 시도 : 작동하지만,이 속도 증가의 또 다른 요인 근처에 저를 포기하지 않습니다
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' 루프 다음에 하나씩 증가해야합니다. 좋은 캐치. 결정된. – 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