       Re: Speeding up Vector Comparison

• To: mathgroup at smc.vnet.net
• Subject: [mg61441] Re: [mg61414] Speeding up Vector Comparison
• From: Pratik Desai <pdesai1 at umbc.edu>
• Date: Wed, 19 Oct 2005 02:16:31 -0400 (EDT)
• References: <200510180645.CAA11280@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
>
>
>
Hi

Here is my attempt using the Matrix Manipulation package (most likely
not what you are looking for, but hopefully trigers another probably
faster approach).

<< LinearAlgebra`MatrixManipulation`
v1 = {0.9, 0.9, 0.1, 0.1};
v2 = {0.5, 0.1, 0.5, 0.1};
thresh = 0.5
vnew = {v1, v2}

(* Here I find row position where the row has atleast one member >
threshold value*)
pos = Position[
Table[If[Max[Flatten[
Table[TakeRows[Transpose[vnew], {j, j}], {j, 1,
Length[v1]}][[j]]]] > thresh,
1, 0], {j, 1, 4}], 1]

(* Probably better way to do this subtraction*)
v11 = TakeColumns[Extract[Transpose[vnew], pos], 1]//Flatten
v22 = TakeColumns[Extract[Transpose[vnew], pos], -1]//Flatten
Mean[v11 - v22]
>>0.6

Hope this helps

Pratik   .

--
Pratik Desai