2011-01-17 13 views
3

nehme ich eine Liste von Variablen definiert habenElegantly eine Liste von Variablen ändern: Generalisierung von AddTo, TimesBy, etc

{a,b,c} = {1,2,3} 

Wenn ich sie alle verdoppeln möchte ich dies tun können:

{a,b,c} *= 2 

Die Variablen {a, b, c} werden jetzt zu {2,4,6} ausgewertet. Wenn ich eine beliebige Transformationsfunktion auf sie angewendet werden soll, kann ich dies tun:

{a,b,c} = f /@ {a,b,c} 

Wie würden Sie das tun, ohne die Liste der Variablen zweimal Angabe?

(Beiseite den Einwand, dass ich wahrscheinlich einen Array anstatt eine Liste von deutlich benannten Variablen wollen würde.)

Antwort

0

ich auf eine Antwort auf diese treffen, wenn diese alte Frage bis zur Festsetzung: ForEach loop in Mathematica

definieren der each Funktion wie in der akzeptierte Antwort auf diese Frage können wir diese Frage mit Antwort:

each[i_, {a,b,c}, i = f[i]] 
2

Sie dies tun können:

Function[Null, # = f /@ #, HoldAll][{a, b, c}] 

Zum Beispiel

In[1]:= 
{a,b,c}={1,2,3}; 
Function[Null, #=f/@#,HoldAll][{a,b,c}]; 
{a,b,c} 

Out[3]= {f[1],f[2],f[3]} 

Oder können Sie das gleiche tun, ohne Hartcodierung f, sondern definieren eine benutzerdefinierte set Funktion. Der Effekt der foreach-Schleife kann leicht reproduziert werden, wenn Sie es Listable Attribut geben:

ClearAll[set]; 
SetAttributes[set, {HoldFirst, Listable}] 
set[var_, f_] := var = f[var]; 

Beispiel:

In[10]:= {a,b,c}={1,2,3}; 
set[{a,b,c},f1]; 
{a,b,c} 

Out[12]= {f1[1],f1[2],f1[3]} 

Sie können auch Geschwindigkeitsvorteile für Fälle erhalten möchten, wenn Ihre f Listable ist, die Besonders wichtig ist dies jetzt, da M8 Compile es ermöglicht, dass benutzerdefinierte Funktionen in Bezug auf die Geschwindigkeit von Listabe profitieren, wie es bisher nur integrierte Funktionen konnten. Alles was Sie für set für solche Fälle tun müssen (wenn Sie Geschwindigkeit haben und Sie wissen, dass f Listable ist), ist das Listable Attribut von set zu entfernen.