Re: Compile a Module
- To: mathgroup at smc.vnet.net
- Subject: [mg83171] Re: Compile a Module
- From: Albert <awnl at arcor.net>
- Date: Tue, 13 Nov 2007 07:01:45 -0500 (EST)
- References: <fhbnuc$r4s$1@smc.vnet.net>
JOHN ERB wrote: > Can the following module be compiled? > It needs to be used 10^4 times in my program. > It is used to calculate the distance parallel and perpendicular > to the midpoint of 2D line segment with reference to a point of interest (calc). > > AlongAway[{tip_,end_,calc_}]:=Module[{mid,r,theta,along,away}, > mid=(tip+end)/2; > r=Sqrt[Dot[calc-mid,calc-mid]]; > theta=VectorAngle[calc-mid,end-mid]; > along=r Cos[theta]; > away=r Sin[theta]; > {along,away}] > > AlongAway[{{-1, 0}, {1, 0}, {2, 1}}] > (* answer is {2,1} *) > > (* the code below does not seem to work *) > cAlongAway=Compile[{{tip,_Real},{end,_Real},{calc,_Real}},AlongAway] This is not how Compile works. The following is syntactically what I believe you try to achieve: AlongAwayCompiled = Compile[ {{tip, _Real, 1}, {end, _Real, 1}, {calc, _Real, 1}}, Module[{mid, r, theta, along, away}, mid = (tip + end)/2; r = Sqrt[Dot[calc - mid, calc - mid]]; theta = VectorAngle[calc - mid, end - mid]; along = r Cos[theta]; away = r Sin[theta]; {along, away} ] ] Anyway, since the function VectorAngle can not be compiled, you need to either avoid it (you can look at its docpage to get an idea about how you could replace it) or you tell Compile what kind of result it gives with a third argument: AlongAwayCompiled = Compile[{ {tip, _Real, 1}, {end, _Real, 1}, {calc, _Real, 1} }, Module[{mid, r, theta, along, away}, mid = (tip + end)/2; r = Sqrt[Dot[calc - mid, calc - mid]]; theta = VectorAngle[calc - mid, end - mid]; along = r Cos[theta]; away = r Sin[theta]; {along, away} ], {{VectorAngle[_, _], _Real}} ] In[34]:= AlongAwayCompiled[{-1,0},{1,0},{2,1}] Out[34]= {2.,1.} This works without error messages but since the compiled function still has to call back to the regular evaluation for VectorAngle I doubt that it will be much faster than the uncompiled version... hth, albert