4

假设有两个列表a = {a1, a2, a3}and b = {b1, b2, b3},我想写一个赋值语句来做a1=b1,a2=b2,a3=b3只引用aand b

Thread[a = b]

但它只会使a={b1,b2,b3}. 使用:=(SetDelayed) 代替=也不起作用。
有什么解决办法吗?谢谢。

4

4 回答 4

5

我认为Thread唯一适用于“显式”列表;在操作之前需要扩展变量。

经过一些实验,这对我有用:

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

你也可以写Thread[Evaluate@a = Evaluate@b];只取决于您发现哪个更具可读性。

于 2009-10-31T08:44:11.860 回答
2

有什么问题

MapThread[Set,{{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

好吧,如果它们真的被称为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

给出 和的结果aba

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

正如预期的那样。

一般来说,您可以通过正确使用SymbolNameand来创建这样的表达式Symbol,但要小心您的评估。如果我写了SymbolName[x](没有Unevaluated),那么它会将其解释为SymbolName[{a1, a2, a3}],这显然是不可取的。不使用EvaluateonSymbol[s1 <> sn]会使 Mathematica 抱怨您正在尝试重新分配Symbol函数。

于 2009-10-31T08:43:36.823 回答