簡體   English   中英

向量數組通過旋轉矩陣的旋轉

[英]Rotation of an array of vectors by an array of rotation matrices

如果我們有一個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旋轉矩陣(每個“行”向量一個旋轉矩陣)旋轉。 這與循環很直接,但是有沒有更快,更緊湊(矢量化)的方法來實現,例如使用numpydot或張量tensorproduct

循環實現的示例代碼:

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)])

假設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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM