[Numpy-discussion] permutation symbol

Nils Wagner nwagner at iam.uni-stuttgart.de
Tue Jun 30 14:26:50 EDT 2009


On Tue, 30 Jun 2009 11:10:39 -0600
  Charles R Harris <charlesr.harris at gmail.com> wrote:
> On Tue, Jun 30, 2009 at 10:56 AM, Charles R Harris <
> charlesr.harris at gmail.com> wrote:
> 
>>
>>
>> On Tue, Jun 30, 2009 at 10:40 AM, Nils Wagner <
>> nwagner at iam.uni-stuttgart.de> wrote:
>>
>>> On Tue, 30 Jun 2009 10:27:05 -0600
>>>  Charles R Harris <charlesr.harris at gmail.com> wrote:
>>> > On Tue, Jun 30, 2009 at 5:11 AM, Nils Wagner
>>> > <nwagner at iam.uni-stuttgart.de>wrote:
>>> >
>>> >> On Tue, 30 Jun 2009 11:22:34 +0200
>>> >>  "Nils Wagner" <nwagner at iam.uni-stuttgart.de> wrote:
>>> >>
>>> >>>  Hi all,
>>> >>>
>>> >>> How can I build the following product with numpy
>>> >>>
>>> >>> q_i = \varepsilon_{ijk} q_{kj}
>>> >>>
>>> >>> where  \varepsilon_{ijk} denotes the permutation 
>>>symbol.
>>> >>>
>>> >>> Nils
>>> >>>
>>> >>  Sorry for replying to myself.
>>> >> The permutation symbol is also known as the 
>>>Levi-Civita
>>> >>symbol.
>>> >> I found an explicit expression at
>>> >> http://en.wikipedia.org/wiki/Levi-Civita_symbol
>>> >>
>>> >> How do I build the product of the Levi-Civita symbol
>>> >>\varepsilon_{ijk} and
>>> >> the two dimensional array
>>> >> q_{kj}, i,j,k = 1,2,3 ?
>>> >>
>>> >
>>> > Write it out explicitly. It essentially 
>>>antisymmetrizes
>>> >q and the three off
>>> > diagonal elements can then be treated as a vector.
>>> >Depending on how q is
>>> > formed and the resulting vector is used there may be
>>> >other things you can do
>>> > when you use it in a more general expression. If this 
>>>is
>>> >part of a general
>>> > calculation there might be other ways of expressing 
>>>it.
>>> >
>>> > Chuck
>>>
>>> Hi Chuck,
>>>
>>> Thank you for your response.
>>> The problem at hand is described in a paper by Angeles
>>> namely equation (17c) in
>>> "Automatic computation of the screw parameters of
>>> rigid-body motions.
>>> Part I: Finitely-separated positions"
>>> Journal of Dynamic systems, Measurement and Control, 
>>>Vol.
>>> 108 (1986) pp. 32-38
>>>
>>
>> You can solve this problem using quaternions also, in 
>>which case it reduces
>> to an eigenvalue problem. You will note that such things 
>>as PCA are used in
>> the papers that reference the cited work so you can't 
>>really get around that
>> bit of inefficiency.
>>
> 
> Here's a reference to the quaternion approach:
> http://people.csail.mit.edu/bkph/papers/Absolute_Orientation.pdf. 
>You can
> get the translation part from the motion of the 
>centroid.
> 
> If you are into abstractions you will note that the 
>problem reduces to
> minimising a quadratic form in the quaternion 
>components. The rest is just
> algebra ;)
> 
> Chuck

It turns out that the product is simply an invariant of a 
3 \times 3 matrix.

from numpy import array, zeros, identity
from numpy.linalg import norm


def vect(A):
     """ linear invariant of a 3 x 3 matrix """
     tmp = zeros(3,float)
     tmp[0] = 0.5*(A[2,1]-A[1,2])
     tmp[1] = 0.5*(A[0,2]-A[2,0])
     tmp[2] = 0.5*(A[1,0]-A[0,1])

     return tmp

Q = array([[0,0,-1],[-1,0,0],[0,1,0]])

q = vect(Q)
print q
  

Nils



More information about the NumPy-Discussion mailing list