DMUG-Archiv 2001

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Programmierung mit Zeichenketten

Hallo,

makeSymRules[firstChar_String, symlst_] :=
  Module[{rules, n},
    n = Length[Characters[firstChar]];
    Thread[(ToExpression[StringJoin[#]] & /@ 
            symlst) -> (ToExpression[firstChar][Sequence @@ #] & /@ ( 
              Drop[#, n] & /@ symlst /. s_String :> ToExpression[s]))]
    ]

Transform[expr_, firstChars_String] :=
  Module[{syms, pat},
    syms = Cases[expr, _Symbol, Infinity];
    If[{} === syms, Return[expr]];
    pat = Append[Characters[firstChars], ___];
    syms = Select[
        Characters[ToString[#]] & /@ syms,
        MatchQ[#, pat] &
        ];
    expr /. makeSymRules[firstChars, syms]
    ]


und

In[]:=Transform[3 t u^2 v xyz46 + 7 t^2 u xyz56, "xyz"]
Out[]=
3*t*u^2*v*xyz[4, 6] + 7*t^2*u*xyz[5, 6]

Gruss
  Jens

Ulrich Jentschura wrote:
> 
> Hallo, liebe Mathematica-DMUG-Vereinsmitglieder,
> 
> ich stehe gerade vor folgendem Problem: Eine Routine zu schreiben, die
> letztendlich in einem Ausdruck erkennt, ob Symbole mit Namen
> 
> xyz21   oder   xyz33   oder   xyz76
> 
> vorhanden sind, d.h. ob es im Ausdruck Variablen mit diesen Namen gibt,
> und dann diese Variablen so analysiert, dass aus
> 
> xyz21 -> xyz[2,1]
> 
> xyz33 -> xyz[3,3]
> 
> xyz76 -> xyz[7,6]
> 
> wird. Das heisst, am Ende sollte eine Routine, nennen wir sie "Transform",
> dastehen, so dass
> 
> In[1]:= Transform[3 t u^2 v xyz46 + 7 t^2 u xyz56]
> 
> Out[1]= 3 t u^2 v xyz[4,6] + 7 t^2 u xyz[5,6]
> 
> dasteht. Eigentlich sollte das einfach sein, aber...
> 
> Ueber Antworten/Tips wuerde ich mich sehr freuen,
> 
> Viele Gruesse,
> 
> Ulrich
>


Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html