无法在Pytorch中创建3D旋转矩阵-ValueError:只能将一个元素张量转换为Python标量

时间:2019-07-17 00:54:28

标签: python-3.x numpy pytorch

我正在尝试在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标量”

我应该如何更改代码以实现目标?

1 个答案:

答案 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]]])

请注意,我们一次分配了所有所有天使,因此该解决方案适用于您可能具有的任意角度。