通过一组旋转矩阵对向量数组进行旋转

4
如果我们有一个 3 x 3 的旋转矩阵 R,它可以与 v 相乘,v 是一个 3 x N 的数组 - 一个由 N 列向量组成的数组 - 以产生一个新的 3 x N 的旋转向量数组,如下所示:
v_rotated = R.dot(v)

现在假设我们有一个 N x M x 3 数组,即 NM 列的向量数组,我想要用 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
@Divakar 添加了循环代码(当然只是玩具示例)。 - sulkeh
也许这个关于如何计算旋转矩阵向量化的问题对某些人有用:https://stackoverflow.com/q/67874876/12131616 - Puco4
1个回答

7

假设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)

其中l是在N上的索引,ij是在3x3旋转维度上的索引,k是在M上的索引。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接