MathGroup Archive 2006

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

Search the Archive

Re: Vector operations,

  • To: mathgroup at smc.vnet.net
  • Subject: [mg70015] Re: Vector operations,
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Sat, 30 Sep 2006 05:12:46 -0400 (EDT)
  • Organization: The Open University, Milton Keynes, UK
  • References: <efitqn$lu4$1@smc.vnet.net>

mickey wrote:
> Hi,
> 
> I have a list of vectors such as
> 
> {{1/2, 1/2}, {1, 0}, {0, 1}, {0, 0}}
> 
> I want to rotate them all by the same angle. Right now, what I do is 
> multiply each by RotationMatrix2D[t] and iterate over the list. Is there 
> a more efficient way to do this?
> 
> Thanks,
> -M
> 

The fastest computation is the dot product of the list of vectors with
components given is machine-precision numbers over the rotation matrix
(see In[13]).

In[1]:=
Needs["Geometry`Rotations`"]

In[2]:=
(* Here we use exact arithmetic *)

In[3]:=
m = RotationMatrix2D[Pi/4]

Out[3]=
{{1/Sqrt[2], 1/Sqrt[2]}, {-(1/Sqrt[2]), 1/Sqrt[2]}}

In[4]:=
(* We generate 100,000 2-dimensional vectors *)

In[5]:=
vecs = Partition[Range[1, 200000], 2];

In[6]:=
t1 = Timing[s1 = (Rotate2D[#1, -(Pi/4)] & ) /@
        vecs; ][[1]]

Out[6]=
11.735 Second

In[7]:=
t2 = Timing[s2 = vecs . m; ][[1]]

Out[7]=
5.718 Second

In[8]:=
(* Now we switch to hardware-precision arithmetic *)

In[9]:=
vecs = N[vecs];
theta = N[-(Pi/4)];
m = N[m];

In[12]:=
t3 = Timing[s3 = (Rotate2D[#1, theta] & ) /@ vecs; ][[
    1]]

Out[12]=
2.297 Second

In[13]:=
t4 = Timing[s4 = vecs . m; ][[1]]

Out[13]=
0.015 Second

In[14]:=
Count[Chop[s3 - s4], {0, 0}]

Out[14]=
100000

In[15]:=
Count[Chop[s1 - s4], {0, 0}]

Out[15]=
100000

In[16]:=
s1 == s2

Out[16]=
True

In[17]:=
t1/t4

Out[17]=
782.333

Regards,
Jean-Marc


  • Prev by Date: HoldPattern question
  • Next by Date: Input, output troubles me ...
  • Previous by thread: Re: Vector operations,
  • Next by thread: [RESEND] How to tell Mathematica to use hardware floating point aithmetics