4

2 つのリストa = {a1, a2, a3}とがあり、 とのみを参照するb = {b1, b2, b3}make への割り当てステートメントを書きたいとします。a1=b1,a2=b2,a3=b3ab

Thread[a = b]

しかし、それは作るだけa={b1,b2,b3}です。:=代わりに (SetDelayed)を使用=しても機能しません。
解決策はありますか?ありがとう。

4

4 に答える 4

5

Thread「明示的な」リストでのみ機能すると思います。変数は、操作する前に展開する必要があります。

いくつかの実験の後、これは私にとってはうまくいきます:

= {a1、a2、a3};
b = {b1、b2、b3};
Thread[Set[Evaluate@a, Evaluate@b]];
{a1、a2、a3}

と書くこともできThread[Evaluate@a = Evaluate@b]ます。どちらが読みやすいかによって異なります。

于 2009-10-31T08:44:11.860 に答える
2

どうしたの

MapThread[セット,{{a1,a2,a3},{b1,b2,b3}}]

?

于 2010-10-06T18:18:47.283 に答える
1

別の解決策は次のとおりです。

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}]
于 2009-10-31T18:52:23.593 に答える
0

それらが本当に 、 などと呼ばれている場合はa1a2次のようにすることができます。

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

abおよびa再び次のように結果を示します。

{a1, a2, a3}
{b1, b2, b3}
{b1, b2, b3}

予想通り。

一般に、 と を適切に使用するSymbolNameSymbol、このような式を作成できますが、評価には注意してください。私がSymbolName[x]( なしでUnevaluated) を書いた場合、それは と解釈されてしまいますがSymbolName[{a1, a2, a3}]、これは明らかに望ましくありません。Evaluateonを使用しないSymbol[s1 <> sn]と、Mathematica は関数を再割り当てしようとしていると文句を言いますSymbol

于 2009-10-31T08:43:36.823 に答える