theevann
(Evann)
February 12, 2018, 9:20am
1
Hi !
I have a matrix n*m of n different vectors of dimensions m.
I would like to get n matrices of size m*m with each matrix being a diagonal of a vector.
I guess I could do:
d = []
for vec in mat:
d.append(torch.diag(vec))
torch.stack(d)
But isn’t there any better ‘pytorchic’ way ?
2 Likes
SimonW
(Simon Wang)
February 12, 2018, 9:25pm
2
Yes! It’s kind of hidden, but here you go:
>>> mat = Variable(torch.randn(3, 4))
>>> res = Variable(torch.zeros(3, 4, 4))
>>> res.as_strided(mat.size(), [res.stride(0), res.size(2) + 1]).copy_(mat)
Variable containing:
0.0422 0.0896 1.4919 -0.7167
-2.4854 0.3412 -1.4421 -0.5081
-0.6238 0.2446 -0.2848 -0.4184
[torch.FloatTensor of size (3,4)]
>>> res
(0 ,.,.) =
0.0422 0.0000 0.0000 0.0000
0.0000 0.0896 0.0000 0.0000
0.0000 0.0000 1.4919 0.0000
0.0000 0.0000 0.0000 -0.7167
(1 ,.,.) =
-2.4854 0.0000 0.0000 0.0000
0.0000 0.3412 0.0000 0.0000
0.0000 0.0000 -1.4421 0.0000
0.0000 0.0000 0.0000 -0.5081
(2 ,.,.) =
-0.6238 0.0000 0.0000 0.0000
0.0000 0.2446 0.0000 0.0000
0.0000 0.0000 -0.2848 0.0000
0.0000 0.0000 0.0000 -0.4184
[torch.FloatTensor of size 3x4x4]
I’ve created an issue for this at https://github.com/pytorch/pytorch/issues/5198
5 Likes
For the sake of completeness and to save future readers trouble, the function you are looking for is torch.diag_embed
.
13 Likes
linyu
(linyu)
October 6, 2019, 2:53am
4
However, pytorch0.4.1 has not this function. How can I do this on pytorch0.4.1?