执行矩阵乘法以计算 python 中的旋转
perform matrix multiplication to compute rotation in python
我有一堆图像坐标存储在大小为 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.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
我有一堆图像坐标存储在大小为 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.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