2016-08-16 8 views
1

私は、一様乱数四元数を作成するPython(NumPy)関数を持っています。私は同じまたは別の関数から2次元の返された配列として2つの四元数の乗算を得たいと思います。私の最近のケースでの四元数乗法の式はQ1 * Q2とQ2 * Q1です。ここで、Q1=(w0, x0, y0, z0)Q2=(w1, x1, y1, z1)は2クォータニオンです。予想される2クォータニオン乗算出力(2-d戻り配列)は2つの四元数の一様乱数四元数と乗算の作成

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]) 

です。私のコードはここにある:[0] [1]

あなたはそれをする必要はありませんFOO:

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

質問や問題は何ですか? – hpaulj

+0

@ hpaulj私の質問は、Q1 * Q2とQ2 * Q1を別の関数から返された配列として得る方法です。期待されるQ1 * Q2返された配列形式(関数の直前)を見てください。私はQ2 * Q1も作りたいと思います。 – Biophysics

答えて

0

リクエストのシンプルな演奏は次のようになります。

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])] 

結果は、4列のリストです。ただ、2次元配列を取得するためにnp.array()でラップ:私は理解したり、あなたの説明をきれいにしようとしていない

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]]) 

- ちょうどコードを作業としてそれをレンダリングします。

0

2次元配列は、このような配列です。 2つのクォータニオンを掛け合わせると、1つのクォータニオンが得られます。なぜ二次元配列が必要なのか、どのように使用するのかわかりません。

def multQuat(q1, q2): 

は、関連する配列を返す:

はちょうど引数として二つの配列を取る機能があります。

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

'numpy'では' foo [0,1] 'で2次元配列をインデックスします。 – hpaulj

関連する問題