2016-08-16 86 views
1

我有一個創建統一的隨機四元數的python(NumPy)函數。我想獲得兩個四元數乘法作爲來自相同或另一個函數的二維返回數組。在我最近的情況下,四元數乘法的公式是Q1 * Q2和Q2 * Q1。這裏,Q1=(w0, x0, y0, z0)Q2=(w1, x1, y1, z1)是兩個四元數。預期的兩個四元數乘法輸出(作爲二維返回陣列)應該是創建統一的隨機四元數和兩個四元數的乘法

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

任何人都可以幫助我嗎?我的代碼是在這裏:

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個陣列的列表。只需把它包裝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

二維數組是這樣的一個數組:富[0] [1]

您不必這樣做。乘以兩個四元數產生一個四元數。我不明白你爲什麼需要一個二維數組,或者甚至會使用一個二維數組。

只要有一個函數,它接受兩個數組作爲參數:

def multQuat(q1, q2): 

然後返回相關的陣列。

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

在'numpy'中,我們用'foo [0,1]'索引了一個2d數組。 – hpaulj