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]
John,
I have made the following modifications to your code to get it
compilable and to be sure it runs the compiled version when fed with
floating-point-number arguments.
The main argument of the function is declared as a tensor of real
numbers of rank two (i.e. a real matrix).
The arguments tip, end , and calc, are set up within the Module construct.
Finally, we tell Mathematica that, in our case, the built-in function
*VectorAngle* will always return a floating-point number (*VectorAngle
can return infinite, arbitrary, or machine-size precision numbers
depending on its arguments).
In[1]:= cAlongAway =
Compile[{{m, _Real, 2}},
Module[{mid, r, theta, along, away, tip = m[[1]], end = m[[2]],
calc = m[[3]]},
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}}];
cAlongAway[{{-1., 0.}, {1., 0.}, {2., 1.}}]
Out[2]= {2., 1.}
HTH,
--
Jean-Marc