Wolfram mathematica Mathematica 7中列表之间的多重赋值

Wolfram mathematica Mathematica 7中列表之间的多重赋值,wolfram-mathematica,Wolfram Mathematica,假设有两个列表a={a1,a2,a3}和b={b1,b2,b3},我想写一个赋值语句,使a1=b1,a2=b2,a3=b3只引用a和b: Thread[a = b] 但是它只使a={b1,b2,b3}。使用:=(SetDelayed)代替=也不起作用。 有解决办法吗?谢谢。如果它们真的被称为a1,a2等,您可以这样做: Assign[x_, y_] := Module[{s1, s2, n, sn}, s1 = SymbolName[Unevaluated[x]]; s2 = Symb

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

Thread[a = b]
但是它只使
a={b1,b2,b3}
。使用
:=
(SetDelayed)代替
=
也不起作用。

有解决办法吗?谢谢。

如果它们真的被称为
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]
a
b
a
的结果再次显示为:

{a1, a2, a3}
{b1, b2, b3}
{b1, b2, b3}
正如所料


通常,您可以通过正确使用
SymbolName
Symbol
来创建类似的表达式,但请小心计算。如果我写了
SymbolName[x]
(没有
Unevaluated
),那么它会解释为
SymbolName[{a1,a2,a3}]
,这显然是不可取的。如果不在
符号[s1 sn]
上使用
求值
,Mathematica会抱怨您试图重新分配
符号
函数。

我认为
线程
只在“显式”列表上工作;在对变量进行操作之前,需要展开变量

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

a = {a1, a2, a3}; b = {b1, b2, b3}; Thread[Set[Evaluate@a, Evaluate@b]]; {a1, a2, a3} a={a1,a2,a3}; b={b1,b2,b3}; 螺纹[套][Evaluate@a, Evaluate@b]]; {a1,a2,a3}
您还可以编写
线程[Evaluate@a = Evaluate@b]
;这取决于你觉得哪个更可读。

这里有另一个解决方案:

a = {a1, a2, a3};
b = {b1, b2, b3};

each[{x_, y_}, Transpose[{a, b}],
  x = y]
它使用我方便的
每个
功能:

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}]
你怎么了

MapThread[Set,{a1,a2,a3},{b1,b2,b3}]


是的。我想我更喜欢我的解决方案
:)
是的,你的解决方案好得多。(投赞成票)我责怪清晨,责怪几个月来一直在用命令式语言工作而没有接触Mathematica:)哦,我绝对知道那种感觉!谢谢,事实上Evaluate@a = Evaluate@b够了。我不知道“评估”命令。
MapThread[(#1 = #2)&, {a, b}]