Re: Functional programming puzzle
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1880] Re: Functional programming puzzle
- From: el at qua.crl.melco.co.jp (E. Lange)
- Date: Sat, 12 Aug 1995 22:49:57 -0400
>Dear functional programers:
>
>Let ptList = {{1,1,2},{2,1,3},{1,3,2}};
>
>I want a matrix of distances between the points in ptList.
>Any human would think you could get it with
>
>Rij[a_,b_]:=Sqrt[(a-b).(a-b)]
>
>followed by
>
>Outer[Rij,ptList,ptList]
>
>But Mathematica returns a mess, because Outer seems
>to Flatten the ptList before running the outer
>product loops.
A ``oneliner'' solution (using (x-y)^2 = x^2 + y^2 - 2xy) would be
dist[A_] := Sqrt[ #.#&/@A + Transpose[#.#&/@A - 2 A . Transpose[A]] ]
It runs also faster than other proposed solutions:
A = Table[Random[], {25}, {25}];
ptList = point @@ # & /@ A;
Timing[dist[A];]
(* {0.433333 Second, Null} *)
Timing[Outer[distance,ptList,ptList];]
(* {9.33333 Second, Null} *)
Timing[Distances[ptList];]
(* {4.6 Second, Null} *)
( The readable expression for #.#&/@A is Map[sumSquare, A], with
sumSquare[a_] := a.a )
Eberhard Lange