배열 인덱스에 대한 표
Nov 02 2020
다음 표를 요약으로 일반화하고 싶습니다. $s[1], \ldots, s[N]$ 과 $t[1], \ldots t[N]$, 각 변수의 합이 $\{-1, 1\}$.
Table[ expr , {s[1], {-1, 1}}, {s[2], {-1, 1}}, {s[3], {-1, 1}}, {t[1], {-1, 1}}, t[2], {-1, 1}}, {t[3], {-1, 1}} ]
표현식은 두 배열에 따라 다릅니다. $s$ 과 $t$ 복잡한 방식으로.
기본적으로 각 배열 인덱스에 대한 합계를 작성하는 대신 $s[1], s[2], s[3], t[1], t[2], t[3]$, 매개 변수 N에 따라 일반적인 방식으로 어떻게 작성할 수 있습니까?
답변
4 Alan Nov 02 2020 at 19:47
나는 이것이 핵심 또는 귀하의 질문에 있다고 생각합니다.
Clear[s, t]
n = 3;
vars = Join[Array[Indexed[s, #] &, n], Array[Indexed[t, #] &, n]];
vals = Tuples[{-1, 1}, 2 n]; (* the possible configs *)
rules = Thread[Rule[vars, #]] & /@ vals; (* rules linking vars to each config *)
vars /. rules (* an expression in the vars, at each config *)
3 LukasLang Nov 02 2020 at 18:44
여기에 평가 누수없는 방법이 있습니다. (즉, s[1]등이 외부의 값을 가지고 있어도 작동 합니다 Table)
n = 3;
Replace[
Join[s /@ Hold @@ Range@n, t /@ Hold @@ Range@n],
v_ :> {v, {-1, 1}},
1
] /.
Hold[s___] :> Hold@Table[(*remove Hold to evaluate*)
expr,
s
]
(* Hold[
Table[expr, {s[1], {-1, 1}}, {s[2], {-1, 1}}, {s[3], {-1, 1}}, {t[
1], {-1, 1}}, {t[2], {-1, 1}}, {t[3], {-1, 1}}]] *)
위의 주석에서 언급했듯이 Hold테이블을 평가 하려면을 제거해야합니다 . 이것이 어떻게 작동하는지보기 위해 위 표현식의 개별 단계 중 일부를 보여줍니다.
(* list of s "variables" *)
s /@ Hold @@ Range@n
(* Hold[s[1], s[2], s[3]] *)
(* combine with t "variables" *)
Join[s /@ Hold @@ Range@n, t /@ Hold @@ Range@n]
(* Hold[s[1], s[2], s[3], t[1], t[2], t[3]] *)
(* insert the iterator specifications *)
Replace[
Join[s /@ Hold @@ Range@n, t /@ Hold @@ Range@n],
v_ :> {v, {-1, 1}},
1
]
(* Hold[{s[1], {-1, 1}}, {s[2], {-1, 1}}, {s[3], {-1, 1}}, {t[
1], {-1, 1}}, {t[2], {-1, 1}}, {t[3], {-1, 1}}] *)
평가 누출에 관심이 없다면 다음으로 충분합니다.
n = 3;
Hold@Table[expr, ##] & @@ (
{#, {-1, 1}} & /@ Join[s /@ Range@n, t /@ Range@n]
)
(* Hold[
Table[expr, {s[1], {-1, 1}}, {s[2], {-1, 1}}, {s[3], {-1, 1}}, {t[
1], {-1, 1}}, {t[2], {-1, 1}}, {t[3], {-1, 1}}]] *)
다시 말하지만 실제 코드에서 보류를 제거해야합니다.
Array변수가 사용되는 방식을 변경할 수있는 경우 사용을 고려할 수도 있습니다 .
n = 3;
Array[f[##] &, ConstantArray[2, n], {-1, 1}]
(* {{{f[-1, -1, -1], f[-1, -1, 1]}, {f[-1, 1, -1],
f[-1, 1, 1]}}, {{f[1, -1, -1], f[1, -1, 1]}, {f[1, 1, -1],
f[1, 1, 1]}}} *)
여기서 함수는 f단순히 s[…]및 의 값을 t[…]순서대로 가져옵니다 .
2 cvgmt Nov 03 2020 at 07:11
@Alan은 문제를 해결하는 우아한 방법을 제공했습니다.
여기서 우리는 원래 표현을 언급합니다.
Table[expr[s1, s2, s3, t1, t2, t3], {s1, {-1, 1}}, {s2, {-1, 1}}, {s3, {-1, 1}}, {t1, {-1,1}}, {t2, {-1, 1}}, {t3, {-1, 1}}]
다음과 같다
Outer[expr, {-1, 1}, {-1, 1}, {-1, 1}, {-1, 1}, {-1, 1}, {-1, 1}]