# [Numpy-discussion] permutation symbol

Nils Wagner nwagner@iam.uni-stuttgart...
Tue Jun 30 13:26:50 CDT 2009

On Tue, 30 Jun 2009 11:10:39 -0600
Charles R Harris <charlesr.harris@gmail.com> wrote:
> On Tue, Jun 30, 2009 at 10:56 AM, Charles R Harris <
> charlesr.harris@gmail.com> wrote:
>
>>
>>
>> On Tue, Jun 30, 2009 at 10:40 AM, Nils Wagner <
>> nwagner@iam.uni-stuttgart.de> wrote:
>>
>>> On Tue, 30 Jun 2009 10:27:05 -0600
>>>  Charles R Harris <charlesr.harris@gmail.com> wrote:
>>> > On Tue, Jun 30, 2009 at 5:11 AM, Nils Wagner
>>> > <nwagner@iam.uni-stuttgart.de>wrote:
>>> >
>>> >> On Tue, 30 Jun 2009 11:22:34 +0200
>>> >>  "Nils Wagner" <nwagner@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