将每一行乘以不同的旋转矩阵

3

这个函数将pose的每一行分别乘以不同的旋转矩阵。是否有可能通过使用一个三维张量来避免循环?

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
这里有一个带有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)

或者,用一个涉及一个额外的 einsum 的步骤替换掉 c 的两个分配步骤 -
np.einsum('ijj->ij',cs)[...] = c[:,None]

使用 `np.einsum` 中值为 `True` 的优化标志 `optimize` 来利用 `BLAS`。
或者,我们可以使用 Python 3.x 中的 `np.matmul/@` 运算符来替换 `einsum` 部分 -
p_out[:,:2] += np.matmul(pose[:,None,:2],cs)[:,0]

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