我正在尝试在pytorch中创建3D旋转矩阵,如本pdf的首页所示,但是我遇到了一些问题。到目前为止,这是我的代码:
zero = torch.from_numpy(np.zeros(len(cos)))
one = torch.from_numpy(np.ones(len(cos)))
R_transpose = torch.tensor([cos, -sin, zero, sin, cos, zero, zero, zero, one]).reshape(-1, 3, 3)
cos和sin是看起来像这样的矩阵:
tensor([[[1.]],
[[1.]],
[[1.]],
[[1.]],
[[1.]]], dtype=torch.float64)
我的目标是创建x个旋转矩阵(例如,上面显示cos值的四个矩阵)。
我当前拥有的代码导致“ ValueError:只能将一个元素张量转换为Python标量”
我应该如何更改代码以实现目标?
答案 0 :(得分:0)
您为什么不使用分配来创建R_transpose
?
# define rotation angels (radians) using numpy
th_np = np.array([np.pi*0.25, np.pi/6, np.pi*0.5, np.pi/3.], dtype=np.float32)
# conver to pytorch
th_t = torch.from_numpy(th_np)
# init to zeros
R_transpose = torch.zeros(th_t.numel(), 3, 3, dtype=torch.float)
# assign the values:
R_transpose[:, 2, 2] = 1.
R_transpose[:, [0,1],[0,1]] = th_t[:, None].cos()
R_transpose[:, 0, 1] = -th_t.sin()
R_transpose[:, 1, 0] = th_t.sin()
结果
tensor([[[ 7.0711e-01, -7.0711e-01, 0.0000e+00], [ 7.0711e-01, 7.0711e-01, 0.0000e+00], [ 0.0000e+00, 0.0000e+00, 1.0000e+00]], [[ 8.6603e-01, -5.0000e-01, 0.0000e+00], [ 5.0000e-01, 8.6603e-01, 0.0000e+00], [ 0.0000e+00, 0.0000e+00, 1.0000e+00]], [[-4.3711e-08, -1.0000e+00, 0.0000e+00], [ 1.0000e+00, -4.3711e-08, 0.0000e+00], [ 0.0000e+00, 0.0000e+00, 1.0000e+00]], [[ 5.0000e-01, -8.6603e-01, 0.0000e+00], [ 8.6603e-01, 5.0000e-01, 0.0000e+00], [ 0.0000e+00, 0.0000e+00, 1.0000e+00]]])
请注意,我们一次分配了所有所有天使,因此该解决方案适用于您可能具有的任意角度。