【问题标题】:perform matrix multiplication to compute rotation in python在python中执行矩阵乘法来计算旋转
【发布时间】:2018-02-18 02:20:12
【问题描述】:

我有一堆图像坐标存储在大小为Nx2xHxW 的矩阵中。 “N”表示图像的个数,“H”和“W”是高度和宽度的缩写,这个矩阵的每个nx1xHxW实例都存储了图像n的x和y坐标。

通过创建一个 2x2 旋转矩阵 R 来对 2x1 向量 V 应用旋转:

[[np.cos(theta), -np.sin(theta)],
 [np.sin(theta), np.sin(theta)]]

并执行矩阵乘法 R * V,得到一个新的 2x1 向量。

现在我有一个大小为 Nx2x2 的旋转矩阵 R,我想将旋转计算应用于 M 的每个实例。一个简单的方法是:

B = 8
N = 2
H = 100
W = 200
M = np.random.rand(B, N, H, W)
R = np.random.rand(B, N, N)

for i in range(B):
    tmp1 = R[i, 0, 0] * M[i, 0, :, :] + R[i, 0, 1] * M[i, 1, :, :]
    tmp2 = R[i, 1, 0] * M[i, 0, :, :] + R[i, 1, 1] * M[i, 1, :, :]
    M[i, 0, :, :] = tmp1
    M[i, 1, :, :] = tmp2

这显然是非常低效的,我想知道在 python 中是否有更好的方法来执行这样的任务。

谢谢!

【问题讨论】:

  • 查看 np.matmul

标签: python numpy matrix rotation matrix-multiplication


【解决方案1】:

一种方法是使用np.einsum

>>> Mpp = np.einsum('ijk,iklm->ijlm', R, M)

#verify
>>> for i in range(B):
...     tmp1 = R[i, 0, 0] * M[i, 0, :, :] + R[i, 0, 1] * M[i, 1, :, :]
...     tmp2 = R[i, 1, 0] * M[i, 0, :, :] + R[i, 1, 1] * M[i, 1, :, :]
...     M[i, 0, :, :] = tmp1
...     M[i, 1, :, :] = tmp2
... 
>>> 
>>> np.allclose(Mpp, M)
True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多