Hi,
I need to generate a skew symmetric matrix from some weights. It would suffice to generate an upper triangular matrix A from the weights, since then
S = A - A.t()
would do the trick. The hard part is generating the matrix A from a vector, i.e. [x,y,z] to
0,x,y
0,0,z
0,0,0
and similarly for longer vectors.
Any ideas for how to do this?
1 Like
def skewmat(x_vec):
'''
torch.matrix_exp(a)
Eigen::Matrix3f mat = Eigen::Matrix3f::Zero();
mat(0, 1) = -v[2]; mat(0, 2) = +v[1];
mat(1, 0) = +v[2]; mat(1, 2) = -v[0];
mat(2, 0) = -v[1]; mat(2, 1) = +v[0];
return mat;
input : (*, 3)
output : (*, 3, 3)
'''
W_row0 = torch.tensor([0,0,0, 0,0,1, 0,-1,0]).view(3,3).to(x_vec.device)
W_row1 = torch.tensor([0,0,-1, 0,0,0, 1,0,0]).view(3,3).to(x_vec.device)
W_row2 = torch.tensor([0,1,0, -1,0,0, 0,0,0]).view(3,3).to(x_vec.device)
x_skewmat = torch.stack([torch.matmul(x_vec, W_row0.t()) , torch.matmul(x_vec, W_row1.t()), torch.matmul(x_vec, W_row2.t())] , dim = -1)
return x_skewmat