Re: Modifying arguments of sub-parts of an expression
- To: mathgroup at smc.vnet.net
- Subject: [mg38879] Re: Modifying arguments of sub-parts of an expression
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Fri, 17 Jan 2003 05:38:34 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Gareth Russell had an expression such as Gamma[a]*Gamma[b]/Beta[a,b]*Gamma[a+b] and wanted to make a new expression where for every subexpression with head Gamma, if the arguments include b, each b is replaced by b+1. He wanted a function that would make this change. My solution is below. ----------------------- In[1]:= SubPosnQ[list1_,list2_]:= (Length[list2]<Length[list1])&&(Take[list1,Length[list2]]===list2) In[2]:= Modify[expr_]:= With[{ posn = Intersection[ Position[expr, b], Position[expr, _Gamma], SameTest -> SubPosnQ ] }, ReplacePart[ expr, b+1, posn ] ] ----------------------- Example: In[3]:= ex=(20*Gamma[a]^2*Gamma[1+a]^2*Gamma[3+b]^3*Gamma[4+b])/ (Beta[a,b]^3*Gamma[3+a+b]*Gamma[5+a+b]); In[4]:= Modify[ex] Out[4]= (20*Gamma[a]^2*Gamma[1+a]^2*Gamma[4+b]^3*Gamma[5+b]) (Beta[a,b]^3*Gamma[4+a+b]*Gamma[6+a+b]) ------------------------ In the above solution I tried to make it concise and easy to read. If speed is more important you could make SubPosnQ a compiled function, or use a pure function instead of SubPosnQ. You could also avoid using Intesection to make (posn) since it's rather slow when a non-default SameTest is used. ------------------------ Regards, Ted Ersek Download my collection of Mathematica tricks from: http://www.verbeia.com/mathematica/tips/Tricks.html and http://www.verbeia.com/mathematica/tips/GraphicsTricks.html