fastest way to do pair-sum / make pair-list
- To: mathgroup at smc.vnet.net
- Subject: [mg23223] fastest way to do pair-sum / make pair-list
- From: Wagner Truppel <wtruppel at uci.edu>
- Date: Tue, 25 Apr 2000 01:40:28 -0400 (EDT)
- References: <200004240512.BAA15307@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Below's my solution, with some running times obtained on a 300 MHz Mac.
The rationale behind it is very simple. Take the example of a list of
4 elements, m = {a1, a2, a3, a4}. The difference m - RotateLeft[m] is
equal to
{a1 - a2, a2 - a3, a3 - a4, a4 - a1}. By computing all but one of
these "rotated differences" we obtain all pairwise differences, each
appearing twice (with opposite signs). The excluded difference is
that which results in {0, 0, 0, 0}.
Squaring affects each element individually, flattening removes the
internal list structure, Apply[] sums all the elements, but we need
to divide by 2.0 because each difference squared appears twice in the
sum. Compiling is the final touch to gain on speed.
Wagner Truppel
wtruppel at uci.edu
SumOfPairwiseSquaredDifferences =
Compile[ { { m, _Real, 1 } },
Module[ { t = m },
Apply[ Plus,
Flatten[
Table[
t = RotateLeft[t];
(m - t)^2,
{ Length[m] - 1 }
]
]
] / 2.0
]
];
n = 50;
m = Table[ Random[], { n } ];
{ n, Timing[ SumOfPairwiseSquaredDifferences[m] ] }
{ 50, {0. Second, 183.897 } }
n = 100;
m = Table[ Random[], { n } ];
{ n, Timing[ SumOfPairwiseSquaredDifferences[m] ] }
{ 100, {0.0333333 Second, 901.846 } }
n = 200;
m = Table[ Random[], { n } ];
{ n, Timing[ SumOfPairwiseSquaredDifferences[m] ] }
{ 200, {0.15 Second, 3459.08 } }
n = 500;
m = Table[ Random[], { n } ];
{ n, Timing[ SumOfPairwiseSquaredDifferences[m] ] }
{ 500, {0.85 Second, 20902. } }
- References:
- Re: fastest way to do pair-sum / make pair-list
- From: "Mark Harder" <harderm@ucs.orst.edu>
- Re: fastest way to do pair-sum / make pair-list