创建均匀随机四元数和两个四元数的乘法
Creating uniform random quaternion and multiplication of two 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 + 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相关数组。
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]])
我没有尝试理解或整理您的描述 - 只是将其呈现为工作代码。
我知道 post 很旧,但想添加一个使用 pyquaternion 库的函数来计算四元数乘法。题中提到的四元数乘法称为Hamilton乘积。您可以像下面这样使用它...
from pyquaternion import Quaternion
q1 = Quaternion()
q2 = Quaternion()
q1_q2 = q1*q2
您可以在此处找到有关此库的更多信息http://kieranwynn.github.io/pyquaternion/
我知道这个问题很老但是我发现它很有趣,为了将来参考我特此写一个答案:如果四元数没有特殊的数据类型是可取的,那么四元数可以写成实数的元组数字和法向量作为浮点数组。因此,在数学上,基于提到的过程here,两个四元数$\hat{q}_1=(w_1,\mathbf{v}_1k$和$\hat{q}的哈密顿积_2=(w_2,\mathbf{v}_2)$ 将是:
$$\hat{q}_1 \hat{q}_2=(w_1 w_2-\mathbf{v}^T_1\mathbf{v}_2, w_1 \mathbf{v} _2+w_2 \mathbf{v}_1+\mathbf{v}_1\times \mathbf{v}_2)$$
对不起 math notation that cannot be rendered in Stack Overflow。
因此在 numpy:
import numpy as np
q1=(w1,v1)
q2=(w2,v2)
q1q2=(w1*w2-np.matmul(v1.T,v2),w1*v2+w2*v1+np.cross(v1,v2))
我有一个 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相关数组。
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]])
我没有尝试理解或整理您的描述 - 只是将其呈现为工作代码。
我知道 post 很旧,但想添加一个使用 pyquaternion 库的函数来计算四元数乘法。题中提到的四元数乘法称为Hamilton乘积。您可以像下面这样使用它...
from pyquaternion import Quaternion
q1 = Quaternion()
q2 = Quaternion()
q1_q2 = q1*q2
您可以在此处找到有关此库的更多信息http://kieranwynn.github.io/pyquaternion/
我知道这个问题很老但是我发现它很有趣,为了将来参考我特此写一个答案:如果四元数没有特殊的数据类型是可取的,那么四元数可以写成实数的元组数字和法向量作为浮点数组。因此,在数学上,基于提到的过程here,两个四元数$\hat{q}_1=(w_1,\mathbf{v}_1k$和$\hat{q}的哈密顿积_2=(w_2,\mathbf{v}_2)$ 将是:
$$\hat{q}_1 \hat{q}_2=(w_1 w_2-\mathbf{v}^T_1\mathbf{v}_2, w_1 \mathbf{v} _2+w_2 \mathbf{v}_1+\mathbf{v}_1\times \mathbf{v}_2)$$
对不起 math notation that cannot be rendered in Stack Overflow。 因此在 numpy:
import numpy as np
q1=(w1,v1)
q2=(w2,v2)
q1q2=(w1*w2-np.matmul(v1.T,v2),w1*v2+w2*v1+np.cross(v1,v2))