Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建均匀随机四元数和两个四元数的乘法_Python_Numpy_2d_Quaternions - Fatal编程技术网

Python 创建均匀随机四元数和两个四元数的乘法

Python 创建均匀随机四元数和两个四元数的乘法,python,numpy,2d,quaternions,Python,Numpy,2d,Quaternions,我有一个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 + y

我有一个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])

二维数组是这样的数组:foo[0][1]

你不需要那样做。将两个四元数相乘得到一个四元数。我不明白你为什么需要一个二维数组,或者你会如何使用它

只需使用一个函数,该函数将两个数组作为参数:

def multQuat(q1, q2):
然后返回相关数组

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

二维数组是这样的数组:foo[0][1]

你不需要那样做。将两个四元数相乘得到一个四元数。我不明白你为什么需要一个二维数组,或者你会如何使用它

只需使用一个函数,该函数将两个数组作为参数:

def multQuat(q1, q2):
然后返回相关数组

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

您的请求的简单格式副本如下:

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

我没有试图理解或清理您的描述-只是将其作为工作代码呈现。

您的请求的简单格式副本是:

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

我没有试图理解或清理您的描述,只是将其呈现为工作代码。

有什么问题吗?@hpaulj我的问题是如何从另一个函数中获取作为返回数组的Q1*Q2和Q2*Q1。请查看我预期的Q1*Q2返回数组格式(就在函数之前)。我还想制作Q2*Q1。有什么问题吗?@hpaulj我的问题是如何从另一个函数中获取作为返回数组的Q1*Q2和Q2*Q1。请查看我预期的Q1*Q2返回数组格式(就在函数之前)。我还想制作Q2*Q1。在
numpy
中,我们用
foo[0,1]
索引一个二维数组。在
numpy
中,我们用
foo[0,1]
索引一个二维数组。