Pinverse of a batch of 2d matrices

Is it possible to calculate the pseudo inverse of n matrices in one tensor?
Input tensor (input) has the shape of [n, rows, columns] and in the output should be a tensor (let’s call it pinv) with shape of [n, columns, rows] which for each i, pinv[i, :,:] is the pseudo inverse of input[i, :, :].

Hi,

We do have a batch version of the inverse method but not the pinverse I’m afraid.

then it should be possible to calculate the batch pseudo inverse using the batch inverse like this:

def pinv(self, A):
        P1 = th.matmul(A.transpose(1,2), A)
        P2 = P1.inverse()
        P3 = th.matmul(P2, A.transpose(1,2))
        return P3

right?
Of course it would be the left inverse

pinverse happily takes batches:

a = torch.randn(5,6,3)
b = torch.pinverse(a)
c = torch.stack([torch.pinverse(a_i) for a_i in a], 0)
print((b-c).abs().max())

gives 5e-8 ish discrepancy.

As it goes with Linear Algebra, the invariably awesome @vishwakftw implemented it just in time for the 1.3 release.

As a general rule, the nicely named linear algebra functions do batches.

Best regards

Thomas

1 Like

Ho nice !
I was looking at the doc and this change was not reflected there. I’ll fix that quickly.