Dönme

2016-03-30 21 views
2

, bu v ile 3 x N dizi çarpılabilir Bu gibi vektörler,:Dönme

v_rotated = R.dot(v) 

Şimdi bir N x M x 3 dizi N kez N farklı 3 x 3 dönüş matrisler (vektörlerin her "satır" için bir rotasyon matrisi) ile dönmek üzere isteyen M vektörler olduğunu varsayalım. Bu bir döngü ile yapmak için basittir, ancak bunu yapmak için daha hızlı ve daha kompakt (vectorized) bir yol var, örn. numpy 's dot veya tensorproduct ile mi? döngü uygulanması için

örnek kod:

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

Paylaş biz herhangi bir çözüm önerisini geri kontrol edebilir, böylece hayata varsa loopy kodu? – Divakar

+0

@Divakar döngüsel kod ekledi (elbette oyuncak örneği) – sulkeh

cevap

5

Eğer np.einsum

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

l kullanabilirsiniz en v.shape(N, M, 3) ve R.shape(N, 3, 3) olduğunu varsayalım N, i ve üzerinde endeksidir j, 3x3 rotat üzerindeki dizinlerdir. iyon boyutu ve k, M dizinindedir.

Ben ile benim sonuç eşleşti senin aşağıdaki gibi:

>>> print np.allclose(my_rotated_v, your_rotated_v) 
True 
İlgili konular