2016-08-16 3 views
1

J'ai une fonction python (NumPy) qui crée un quaternion aléatoire uniforme. Je voudrais obtenir deux multiplications de quaternion comme tableau retourné bidimensionnel de la même ou d'une autre fonction. La formule de la multiplication de quaternion dans mon cas récent est Q1 * Q2 et Q2 * Q1. Ici, Q1=(w0, x0, y0, z0) et Q2=(w1, x1, y1, z1) sont deux quaternions. Le prévu deux sorties de multiplication de quaternion (tableau en tant que 2-d de retour) doit êtreCréation d'un quaternion aléatoire uniforme et multiplication de deux quaternions

return([-x1*x0 - y1*y0 - z1*z0 + w1*w0, x1*w0 + y1*z0 - z1*y0 + 
    w1*x0, -x1*z0 + y1*w0 + z1*x0 + w1*y0, x1*y0 - y1*x0 + z1*w0 + 
    w1*z0]) 

Quelqu'un peut-il me aider s'il vous plaît? Mes codes sont ici:

def randQ(N): 
    #Generates a uniform random quaternion 
    #James J. Kuffner 2004 
    #A random array 3xN 
    s = random.rand(3,N) 
    sigma1 = sqrt(1.0 - s[0]) 
    sigma2 = sqrt(s[0]) 
    theta1 = 2*pi*s[1] 
    theta2 = 2*pi*s[2] 
    w = cos(theta2)*sigma2 
    x = sin(theta1)*sigma1 
    y = cos(theta1)*sigma1 
    z = sin(theta2)*sigma2 
    return array([w, x, y, z]) 
+0

Quelle est la question ou le problème? – hpaulj

+0

@hpaulj Ma question est comment je peux obtenir Q1 * Q2 et Q2 * Q1 comme tableau retourné d'une autre fonction. Veuillez regarder mon format de tableau retourné attendu Q1 * Q2 (juste avant la fonction). Je voudrais aussi faire Q2 * Q1. – Biophysics

Répondre

0

Une interprétation simple, de votre demande serait:

In [70]: def multQ(Q1,Q2): 
    ...:  w0,x0,y0,z0 = Q1 # unpack 
    ...:  w1,x1,y1,z1 = Q2 
    ...:  return([-x1*x0 - y1*y0 - z1*z0 + w1*w0, x1*w0 + y1*z0 - z1*y0 + 
    ...:  w1*x0, -x1*z0 + y1*w0 + z1*x0 + w1*y0, x1*y0 - y1*x0 + z1*w0 + 
    ...:  w1*z0]) 
    ...:  

In [72]: multQ(randQ(1),randQ(2)) 
Out[72]: 
[array([-0.37695449, 0.79178506]), 
array([-0.38447116, 0.22030199]), 
array([ 0.44019022, 0.56496059]), 
array([ 0.71855397, 0.07323243])] 

Le résultat est une liste de 4 tableaux. Il suffit de l'envelopper dans np.array() pour obtenir un tableau 2D:

In [73]: M=np.array(_) 

In [74]: M 
Out[74]: 
array([[-0.37695449, 0.79178506], 
     [-0.38447116, 0.22030199], 
     [ 0.44019022, 0.56496059], 
     [ 0.71855397, 0.07323243]]) 

Je ne l'ai pas essayé de comprendre ou de nettoyer votre description - il suffit de le rendre code de travail.

0

Un tableau à 2 dimensions est un tableau comme ceci: foo [0] [1]

Vous n'êtes pas obligé de le faire. La multiplication de deux quaternions donne un quaternion unique. Je ne vois pas pourquoi vous auriez besoin d'un tableau à deux dimensions, ou comment vous pourriez même en utiliser un.

tout simplement avoir une fonction qui prend deux tableaux comme arguments:

def multQuat(q1, q2): 

puis retourne le tableau correspondant.

return array([-q2[1] * q1[1], ...]) 
+0

Dans 'numpy' nous indexons un tableau 2d avec' foo [0,1] '. – hpaulj