2016-03-30 3 views
2

Wenn wir eine 3 x 3 Rotationsmatrix R haben, kann es mit v, eine 3 x N Array multipliziert werden - eine Anordnung von N Spaltenvektoren - eine neue 3 x N Array von gedrehten herzustellen Vektoren, wie hier:Rotation einer Matrix von Vektoren, die durch eine Anordnung von Rotationsmatrizen

v_rotated = R.dot(v) 

Angenommen wir eine N x M x 3 Array, N mal M Vektoren, die ich mit verschiedenen N3 x 3 Rotationsmatrizen (eine Rotationsmatrix für jede „Zeile“ von Vektoren) gedreht werden soll. Dies ist direkt mit einer Schleife zu tun, aber gibt es eine schnellere und kompaktere (vektorisierte) Möglichkeit, dies zu tun, z. mit numpy 's dot oder tensorproduct?

Beispielcode für Schleifenimplementierung:

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

Teilen der loopy Code, wenn Sie implementiert haben, so dass wir über eine vorgeschlagene Lösung prüfen könnte? – Divakar

+0

@Divakar hinzugefügt loopyy code (Spielzeugbeispiel natürlich) – sulkeh

Antwort

5

nehmen wir an, dass v.shape ist (N, M, 3) und R.shape(N, 3, 3) ist, Sie np.einsum

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

wo l ist der Index auf N, i verwenden können, und j sind die Indizes auf 3x3 rotiert Ionendimension und k ist der Index auf M.

ich mein Ergebnis mit Ihrem wie folgt angepasst:

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