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