Regular matrix multiplication:


If I have N1 samples and N2 samples, their dimensions are both D.
X1 = [N1,D], X2 = [N2,D]
Calculate the similarity matrix between samples, I can use S = X2.mm(X1.T), where S = [N2,N1]


But if X1 = [B,N1,D], X2 = [B,N2,D], and the B notes bathsize,
If I want batch-wise calculation of matrix multiplication,
the below is a for-loop version,
how to do it efficiently?


def MatrixMulti(A,B):
    """
    The first dimension is independent 
    and computes matrix multiplication 
    in the remaining dimensions
    inputs:
        A : [b,N1,D]
        B : [b,N2,D]
    output:
        S : [b,N2,N1]
    """

    b,N1,D = A.size()
    b,N2,D = B.size()
    S = torch.zeros((b,N2,N1))
    for i in range(b):
        # [Rb,d] * [d,Ra]
        S[i,:,:] = B[i,:,:].mm(A[i,:,:].transpose(0,1))
    return S