[Numpy-discussion] permutation symbol

Nils Wagner nwagner@iam.uni-stuttgart...
Wed Jul 1 03:35:34 CDT 2009


On Tue, 30 Jun 2009 13:51:15 -0600
  Charles R Harris <charlesr.harris@gmail.com> wrote:
> On Tue, Jun 30, 2009 at 12:26 PM, Nils Wagner
> <nwagner@iam.uni-stuttgart.de>wrote:
> 
>> 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
> 
> 
> Out of curiosity, where did the .5 come from? It is not 
>normally part of the
> Levi-Civita symbol.
> 
> Chuck
  
Hi Chuck,

It's my fault. The components of the invariant q are given 
by

q_i = 0.5 \varepsilon_{ijk} q_{kj}

Nils


More information about the Numpy-discussion mailing list