Re: Speeding up Vector Comparison
- To: mathgroup at smc.vnet.net
- Subject: [mg61437] Re: Speeding up Vector Comparison
- From: "Carl K. Woll" <carlw at u.washington.edu>
- Date: Wed, 19 Oct 2005 02:16:16 -0400 (EDT)
- Organization: University of Washington
- References: <dj275j$bhn$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Lee Newman wrote:
> Dear Group,
>
> I have a compiled function that compares two vectors by computing the
> mean of the absolute value of the difference between the two vectors --
> subject to the constraint that if both sub-elements of the vector are
> less then a threshold value, they do not contribute to the difference
> (see example below). The function gets executed about 100million times
> over the course of a simulation. I've optimized it as much as I can,
> but it is still a bottleneck (~7 hrs). Can anyone see an obvious way to
> rewrite my function (below) so that it runs faster?
>
> Example (the actual vectors I am using have length=100):
> v1 = {0.9, 0.9, 0.1, 0.1};
> v2 = {0.5, 0.1, 0.5, 0.1};
> threshold=0.5
> for these two vectors, I want to compute the mean of the absolute value
> of the difference between the two vectors, ignoring the last position
> because the last value in *both* vectors is < threshold.
>
> My Function
>
> MeanDiff = Compile[{{vector1, _Real,1}, {vector2, _Real, 1}, {threshold,
> _Real}},
> Mean@ Abs[Plus @@@ Select[Transpose[{vector1, -vector2}], Max[Abs
> /@ #] > threshold &]]
> , {{Mean[_], _Real}}];
>
> Note: I use Plus rather than Subtract because Mathematica doesn't allow
> Subtract with @@@ in compiled functions. The third argument to Compile
> seems to be necessary, as without it Mathematica complains that the
> function
> doesn't return a tensor of size 1.
>
> Thanks for any suggestions,
> Lee Newman
>
Here is one possibility:
md2 = Compile[{{v1, _Real, 1}, {v2, _Real, 1}, {t, _Real}},
Module[{valid},
valid = Sign[UnitStep[v1 - t] + UnitStep[v2 - t]];
(valid.Abs[v1 - v2])/Tr[valid]]
]
In my tests it's about an order of magnitude faster than your function, and
about twice as slow as doing simply Abs[v1-v2].
Carl Woll
Wolfram Research