I a transformé la fonction suivanteNumpy: rendre la version batched de la multiplication de quaternion
def quaternion_multiply(quaternion0, quaternion1):
"""Return multiplication of two quaternions.
>>> q = quaternion_multiply([1, -2, 3, 4], [-5, 6, 7, 8])
>>> numpy.allclose(q, [-44, -14, 48, 28])
True
"""
x0, y0, z0, w0 = quaternion0
x1, y1, z1, w1 = quaternion1
return numpy.array((
x1*w0 + y1*z0 - z1*y0 + w1*x0,
-x1*z0 + y1*w0 + z1*x0 + w1*y0,
x1*y0 - y1*x0 + z1*w0 + w1*z0,
-x1*x0 - y1*y0 - z1*z0 + w1*w0), dtype=numpy.float64)
à une version batched
def quat_multiply(self, quaternion0, quaternion1):
x0, y0, z0, w0 = np.split(quaternion0, 4, 1)
x1, y1, z1, w1 = np.split(quaternion1, 4, 1)
result = np.array((
x1*w0 + y1*z0 - z1*y0 + w1*x0,
-x1*z0 + y1*w0 + z1*x0 + w1*y0,
x1*y0 - y1*x0 + z1*w0 + w1*z0,
-x1*x0 - y1*y0 - z1*z0 + w1*w0), dtype=np.float64)
return np.transpose(np.squeeze(result))
Cette fonction gère quaternion1 et quaternion0 avec la forme (4?). Maintenant, je veux que la fonction peut gérer un nombre arbitraire de dimensions, telles que (?,?, 4). Comment faire ça?
Vous pourriez vous épargner une copie en transposant simplement le tableau au lieu d'utiliser 'np.rollaxis' pour amener la dernière dimension au premier plan. –
@ali_m Est-ce que 'np.rollaxis' ne crée pas de vue? – Divakar
Désolé, vous avez raison (je l'ai probablement confondu avec 'np.roll'). Transpose est encore légèrement plus rapide, cependant. –