Я студент, который только начал изучать pytorch.
Я надеюсь создать матрицу попарных кросс-произведений.
Пример ниже.
x=torch.Tensor([[1,0,0],[0,1,0]]) # 2*3
y=torch.Tensor([[2,0,0],[0,2,0],[0,0,2]]) # 3*3
#what I want to get is below using torch.cross
z=torch.Tensor([[[0,0,0],[0,0,2],[0,-2,0]],\
[0,0,-2],[0,0,0],[2,0,0]]]) # 2*3*3
#So I write code
tmp_x=0*y+x.unsqueeze(1)# 2*3*3 , horrible coding.. please modify this.
tmp_y=y+0*x.unsqueeze(1)
z=torch.cross(tmp_x,tmp_y,dim=-1)
Мне кажется, мой код нехорош. Можно мне посоветовать более хороший код?
И есть проблема точности, когда я использую его для типа с плавающей точкой. Перекрестное произведение между вектором и самим собой не является нулевым вектором. Когда я печатаю каждую матрицу в приведенном выше коде, как показано ниже, в этом случае x = y,
print x
print y
print '====='
print tmp_x
print tmp_y
print '====='
print z
, тогда я получаю результат.
tensor([[ 0.2957, 1.6024, -0.1010],
[-1.4755, 0.1937, -0.6091],
[ 1.3540, 0.7203, 0.4037]])
tensor([[ 0.2957, 1.6024, -0.1010],
[-1.4755, 0.1937, -0.6091],
[ 1.3540, 0.7203, 0.4037]])
=======
tensor([[[ 0.2957, 1.6024, -0.1010],
[ 0.2957, 1.6024, -0.1010],
[ 0.2957, 1.6024, -0.1010]],
[[-1.4755, 0.1937, -0.6091],
[-1.4755, 0.1937, -0.6091],
[-1.4755, 0.1937, -0.6091]],
[[ 1.3540, 0.7203, 0.4037],
[ 1.3540, 0.7203, 0.4037],
[ 1.3540, 0.7203, 0.4037]]])
tensor([[[ 0.2957, 1.6024, -0.1010],
[-1.4755, 0.1937, -0.6091],
[ 1.3540, 0.7203, 0.4037]],
[[ 0.2957, 1.6024, -0.1010],
[-1.4755, 0.1937, -0.6091],
[ 1.3540, 0.7203, 0.4037]],
[[ 0.2957, 1.6024, -0.1010],
[-1.4755, 0.1937, -0.6091],
[ 1.3540, 0.7203, 0.4037]]])
=======
tensor([[[ 5.0209e-09, -2.8436e-10, -1.0191e-08],
[-9.5639e-01, 3.2915e-01, 2.4217e+00],
[ 7.1970e-01, -2.5616e-01, -1.9567e+00]],
[[ 9.5639e-01, -3.2915e-01, -2.4217e+00],
[ 6.0023e-10, -2.4257e-08, 1.3432e-08],
[ 5.1692e-01, -2.2897e-01, -1.3251e+00]],
[[-7.1970e-01, 2.5616e-01, 1.9567e+00],
[-5.1692e-01, 2.2897e-01, 1.3251e+00],
[ 9.2649e-09, 5.7705e-09, -4.0787e-09]]])
z [0,0 ,:] must быть нулевым вектором, но это не так. Что я не прав?