2 つのリストa = {a1, a2, a3}
とがあり、 とのみを参照するb = {b1, b2, b3}
make への割り当てステートメントを書きたいとします。a1=b1,a2=b2,a3=b3
a
b
Thread[a = b]
しかし、それは作るだけa={b1,b2,b3}
です。:=
代わりに (SetDelayed)を使用=
しても機能しません。
解決策はありますか?ありがとう。
2 つのリストa = {a1, a2, a3}
とがあり、 とのみを参照するb = {b1, b2, b3}
make への割り当てステートメントを書きたいとします。a1=b1,a2=b2,a3=b3
a
b
Thread[a = b]
しかし、それは作るだけa={b1,b2,b3}
です。:=
代わりに (SetDelayed)を使用=
しても機能しません。
解決策はありますか?ありがとう。
Thread
「明示的な」リストでのみ機能すると思います。変数は、操作する前に展開する必要があります。
いくつかの実験の後、これは私にとってはうまくいきます:
= {a1、a2、a3}; b = {b1、b2、b3}; Thread[Set[Evaluate@a, Evaluate@b]]; {a1、a2、a3}
と書くこともできThread[Evaluate@a = Evaluate@b]
ます。どちらが読みやすいかによって異なります。
どうしたの
MapThread[セット,{{a1,a2,a3},{b1,b2,b3}}]
?
別の解決策は次のとおりです。
a = {a1, a2, a3};
b = {b1, b2, b3};
each[{x_, y_}, Transpose[{a, b}],
x = y]
これは私の便利なeach
機能を使用しています:
SetAttributes[each, HoldAll]; (* each[pattern, list, body] *)
each[pat_, lst_, bod_] := (* converts pattern to body for *)
Scan[Replace[#, pat:>bod]&, Evaluate@lst] (* each element of list. *)
同様に、これを行うことができます:
MapThread[(#1 = #2)&, {a, b}]
それらが本当に 、 などと呼ばれている場合はa1
、a2
次のようにすることができます。
Assign[x_, y_] := Module[{s1, s2, n, sn},
s1 = SymbolName[Unevaluated[x]];
s2 = SymbolName[Unevaluated[y]];
For[n = 1, n <= Length[x] && n <= Length[y], n++,
sn = ToString[n];
Evaluate[Symbol[s1 <> sn]] = Evaluate[Symbol[s2 <> sn]]
]
]
SetAttributes[Assign, HoldAll]
その後
Clear[b1, b2, b3];
Clear[a1, a2, a3];
a = {a1, a2, a3}
b = {b1, b2, b3}
Assign[a, b]
a
a
、b
およびa
再び次のように結果を示します。
{a1, a2, a3}
{b1, b2, b3}
{b1, b2, b3}
予想通り。
一般に、 と を適切に使用するSymbolName
とSymbol
、このような式を作成できますが、評価には注意してください。私がSymbolName[x]
( なしでUnevaluated
) を書いた場合、それは と解釈されてしまいますがSymbolName[{a1, a2, a3}]
、これは明らかに望ましくありません。Evaluate
onを使用しないSymbol[s1 <> sn]
と、Mathematica は関数を再割り当てしようとしていると文句を言いますSymbol
。