Многократное распределение между списками в Mathematica 7 - PullRequest
4 голосов
/ 31 октября 2009

Предположим, есть два списка a = {a1, a2, a3} и b = {b1, b2, b3}, и я хочу написать оператор присваивания, чтобы сделать a1=b1,a2=b2,a3=b3, который относится только к a и b:

Thread[a = b]

Но это только делает a={b1,b2,b3}. Использование := (SetDelayed) вместо = также не работает.
Любое решение? Спасибо.

Ответы [ 4 ]

5 голосов
/ 31 октября 2009

Я думаю, что Thread работает только в «явных» списках; переменные должны быть расширены перед тем, как с ними работать.

После некоторых экспериментов это работает для меня:

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

Вы также можете написать Thread[Evaluate@a = Evaluate@b]; зависит только от того, что вы найдете более читабельным.

2 голосов
/ 06 октября 2010

Что не так с

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

1 голос
/ 31 октября 2009

Вот еще одно решение:

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}]
0 голосов
/ 31 октября 2009

Ну, если они действительно называются 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 на Symbol[s1 <> sn], Mathematica будет жаловаться на то, что вы пытаетесь переназначить функцию Symbol.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...