MathGroup Archive 2005

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

Search the Archive

Re: Speeding up Vector Comparison

  • To: mathgroup at
  • Subject: [mg61441] Re: [mg61414] Speeding up Vector Comparison
  • From: Pratik Desai <pdesai1 at>
  • Date: Wed, 19 Oct 2005 02:16:31 -0400 (EDT)
  • References: <>
  • Sender: owner-wri-mathgroup at

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};
>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, 
>       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 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[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]

Hope this helps

Pratik   .

Pratik Desai
Graduate Student
Department of Mechanical Engineering
Phone: 410 455 8134

  • Prev by Date: Re: Re: Language vs. Library why it matters
  • Next by Date: Re: Mathematica not simplifying Laplace transforms
  • Previous by thread: Speeding up Vector Comparison
  • Next by thread: Re: Speeding up Vector Comparison