Создание равномерного случайного кватерниона и умножение двух кватернионов

У меня есть функция 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])

person Biophysics    schedule 16.08.2016    source источник
comment
В чем вопрос или проблема?   -  person hpaulj    schedule 16.08.2016
comment
@hpaulj Мой вопрос в том, как я могу получить Q1 * Q2 и Q2 * Q1 в качестве возвращаемого массива из другой функции. Пожалуйста, посмотрите на мой ожидаемый формат возвращаемого массива Q1*Q2 (непосредственно перед функцией). Я также хотел бы сделать Q2 * Q1.   -  person Biophysics    schedule 16.08.2016


Ответы (2)


Простым представлением вашего запроса будет:

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(), чтобы получить массив 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]])

Я не пытался понять или очистить ваше описание - просто представил его как рабочий код.

person hpaulj    schedule 16.08.2016

Двумерный массив — это такой массив: foo[0][1]

Вам не нужно этого делать. Умножение двух кватернионов дает один единственный кватернион. Я не понимаю, зачем вам нужен двумерный массив или как его использовать.

Просто есть функция, которая принимает два массива в качестве аргументов:

def multQuat(q1, q2):

затем верните соответствующий массив.

return array([-q2[1] * q1[1], ...])
person dshus    schedule 16.08.2016
comment
В numpy мы индексируем двумерный массив с помощью foo[0,1]. - person hpaulj; 16.08.2016