【问题标题】:Rotation of an array of vectors by an array of rotation matrices通过旋转矩阵数组旋转向量数组
【发布时间】:2016-07-18 07:22:33
【问题描述】:

如果我们有一个3 x 3旋转矩阵R,它可以与v相乘,一个3 x N数组——一个N列向量的数组——产生一个新的3 x N旋转数组向量,像这样:

v_rotated = R.dot(v)

现在假设我们有一个N x M x 3 数组,N 乘以M 向量,我想用N 不同的3 x 3 旋转矩阵来旋转它(每个“行”向量都有一个旋转矩阵)。这很容易用循环来完成,但是有没有更快、更紧凑(矢量化)的方式来做到这一点,例如与numpydottensorproduct?

循环实现示例代码:

from numpy import cos, sin, array, pi, linspace, random

# 100 different rotation matrices:
R = [array([[1, 0, 0], [0, cos(theta), -sin(theta)], [0, sin(theta), cos(theta)]]) for theta in linspace(0, pi, 100)]
# 100 x 200 random vectors:
v = random.random((100, 200, 3))

# rotate vectors in loop:
rotated_v = array([R_.dot(v_.T).T for R_, v_ in zip(R, v)])

【问题讨论】:

  • 如果您已实现,请分享循环代码,以便我们检查任何建议的解决方案?
  • @Divakar 添加了循环代码(当然是玩具示例)
  • 也许这个关于如何计算旋转矩阵向量化的问题对某人有用:stackoverflow.com/q/67874876/12131616

标签: python numpy scipy vectorization


【解决方案1】:

假设v.shape(N, M, 3)R.shape(N, 3, 3), 你可以使用np.einsum

import numpy as np
rotated_v = np.einsum('lij, lkj->lki', R, v)

其中lN 上的索引,ij3x3 旋转维度上的索引,kM 上的索引。

我的结果与您的匹配如下:

>>> print np.allclose(my_rotated_v, your_rotated_v)
True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多