# 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. 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