Умножьте каждую строку на разные матрицы вращения - PullRequest
3 голосов
/ 21 марта 2019

Эта функция умножает каждую из n строк pose на другую матрицу вращения.Можно ли избежать цикла, используя, возможно, 3D-тензор матриц вращения?

def transform(ref, pose):
    n, d = pose.shape
    p = ref[:, :d].copy()
    c = np.cos(ref[:, 2])
    s = np.sin(ref[:, 2])

    for i in range(n):
        p[i,:2] += pose[i,:2].dot(np.array([[c[i], s[i]], [-s[i], c[i]]]))

    return p

1 Ответ

2 голосов
/ 21 марта 2019

Вот один с np.einsum -

# Setup 3D rotation matrix
cs = np.empty((n,2,2))
cs[:,0,0] = c
cs[:,1,1] = c
cs[:,0,1] = s
cs[:,1,0] = -s

# Perform 3D matrix multiplications with einsum
p_out = ref[:, :d].copy()
p_out[:,:2] += np.einsum('ij,ijk->ik',pose[:,:2],cs)

В качестве альтернативы, замените два этапа назначения для c на один, включающий еще один einsum -

np.einsum('ijj->ij',cs)[...] = c[:,None]

Используйте флаг optimize со значением True в np.einsum для использования BLAS.

В качестве альтернативы, мы можем использовать np.matmul/@ operator in Python 3.x для замены einsum детали -

p_out[:,:2] += np.matmul(pose[:,None,:2],cs)[:,0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...