Easy way to compute outer products?

Is there a simple way to compute outer products?
I am looking for something that works like
(x=[1,2], y=[1,3])
torch.outer(x,y) = [1,3;2,6]

Maybe try torch.ger?

1 Like

Perfect, just what i needed. Thanks!

Is there a way to do this in batch mode? So if I have two batches of vectors, is there an easy way to compute the (batch) outer products?

1 Like

Assuming you have two dimensions, you could use
u.unsqueeze(2)*v.unsqueeze(1)
(with latest master) or with explicit expansion for torch <= 0.1.12

b = u.size(0)
m = u.size(1)
n = v.size(1)
u.unsqueeze(2).expand(b,m,n)*v.unsqueeze(1).expand(b,m,n)

Best regards

Thomas

5 Likes

@Cysu torch.ger works for 2 rank 1 tensors. Is there any inbuilt torch function for calculating outer product for any number of rank 1 tensors and not just limited to 2 tensors?

einsum. :slight_smile:

Best regards

Thomas

5 Likes

For two 2D tensors a and b (of size [b,n] and [b,m] respectively),
a[:, :, None] @ b[:, None, :] (of size [b,n,m]) gives the outer product operated on each item in the batch.

It’s easy to extend this to higher dimensions, for example, for two 3D tensors a and b (of size [b,n,m] and [b,n,k]),
a[:, :, :, None] @ b[:,:, None, :] gives the desired outer product of size [b,n,m,k]

Hope this helps!

2 Likes