Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
1995
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1995

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Functional programming puzzle

  • To: mathgroup at christensen.cybernetics.net
  • Subject: [mg1879] Re: Functional programming puzzle
  • From: "Wm. Martin McClain" <wmm at chem.wayne.edu>
  • Date: Sat, 12 Aug 1995 22:49:46 -0400
  • Organization: Wayne State University, College of Science

Count Dracula <lk3a at kelvin.seas.virginia.edu> gave an elegant answer
my question:

> > I want a matrix of distances between the points in pts_List...

The Count's one-line solution depends upon an UNDOCUMENTED feature
of Outer, and also upon avoiding a named  (Dracula's method,
 Here it is:

Dracula's method:
>RijMat[pts_List]:=Sqrt[Map[#.#&,Outer[Subtract,pts,pts,1],{2}]]

The undocumented feature of Outer is its FOURTH PARAMETER, a level 
specification.  It would be interesting if the Count could divulge his 
source of this information, apparently unavailable to mortals.

I created test lists of 5, 10, 20, 40, and 80 three-dimensional 
Random points, with the following results (Dracula's method,
best observed times on a PowerMac 6100 with a speedup gadget):

 {5 pts, 0.00 Sec},{10 pts,0.05 Sec},{20 pts,0.20 Sec},
 {40 pts,0.80 Sec},{80 pts,3.20 Sec}}

Then I added the Outer level spec to my suggested method:

Rij[a_,b_]:=Sqrt[(a-b).(a-b)]
followed by
Outer[Rij,ptList,ptList,1]

My method, with its named external function Rij, took about twice as 
long as Dracula's method.

Finally, I tried another method that uses
LinearAlgebra`MatrixManipulation`UpperDiagonalMatrix 
to cut down on the number of multiplies.  It took about the same 
time as Rij method, but saved a little on space.

Question for WRI people:  The matrix of distances is a vital 
step in many stat mech calculations, and making it faster would 
be a great service.  Could you make a special kind "Outer", or perhaps
just an option for Outer, say Output->UpperTriangular, that would 
avoid calculating the redundant lower triangle of results 
(as well as the zeroes on the diagonal) ?








  • Prev by Date: MS-DOS Version
  • Next by Date: Re: Speeding up a numerical integrator
  • Previous by thread: Re: Functional programming puzzle
  • Next by thread: [Q] weighted regression with Regress