2

How to do THIS in python?

Currently, I can transform a 4X4 matrix 'A' into its bipartite shape [2,2,2,2], as described in here. Once performing the SVD on the latter (the transformed version of 'A') using python via:

and it turns out (in both cases):

  • U.shape = Vh.shape = [2,2,2,2]
  • S.shape = [2,2,2]

I want to write a function:

def to_schmidt(A):
    U, S, Vh = torch.linalg.svd(A)
    
    #
    # Do stuff with U, S, and Vh
    #
    
    return [[s1, ..., s4], [B1, ..., B4], [C1, ..., C4]]

Which returns a list of the s's' B's, and C's just as described in here. Just to clarify (using PyTorch in the example):

should_be_the_original_matrix_A = None
for i in range(4):
    if should_be_the_original_matrix_A = None:
        should_be_the_original_matrix_A = s[i] * torch.kron(B[i], C[i])
    else:
        should_be_the_original_matrix_A += s[i] * torch.kron(B[i], C[i])

#
# The one with A_{i}{j} with i,j = 0, 1, 2, 3
# or alternatively A.shape= [4,4], i.e.
# before the transformation to the bipartite rep.
#

The answer given there uses Mathematica, but as I'm not familiar with it:

How to complete this function?

Hopefully, using PyTorch, NumPy, or anything convertible to them, fairly trivially.

0 Answers0