[Numpy-discussion] Faster way to generate a rotation matrix?

Hoyt Koepke hoytak at gmail.com
Wed Mar 4 21:10:22 EST 2009


You can get even more of a speed up with a couple tricks, though they
might not be noticeable.  The following is my modified version of your
code:

import numpy as np
cimport cython
from numpy cimport ndarray, empty

cdef extern from "math.h":
   double cos(double)
   double sin(double)

def rotation(ndarray[double] theta):
   # I think the syntax for empty is the same in the cimported
numpy.pxd, should check
   cdef ndarray[double, ndim=2, mode="c"] R = empty( (3,3) )

   cdef double cx = cos(theta[0]), cy = cos(theta[1]), cz = cos(theta[2])
   cdef double sx = sin(theta[0]), sy = sin(theta[1]), sz = sin(theta[2])

   with cython.boundscheck(False):
      R[0,0] = cx*cz - sx*cy*sz
      R[0,1] = cx*sz + sx*cy*cz
      R[0,2] = sx*sy

      R[1,0] = -sx*cz - cx*cy*sz
      R[1,1] = -sx*sz + cx*cy*cz
      R[1,2] = cx*sy

      R[2,0] = sy*sz
      R[2,1] = -sy*cz
      R[2,2] = cy

   return R


++++++++++++++++++++++++++++++++++++++++++++++++
+ Hoyt Koepke
+ University of Washington Department of Statistics
+ http://www.stat.washington.edu/~hoytak/
+ hoytak at gmail.com
++++++++++++++++++++++++++++++++++++++++++



More information about the NumPy-Discussion mailing list