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
>