docs: def match(A, S, trueS):
      """Rearranges columns of S to best fit the components they likely represent (maximizes sum of correlations)"""
      cov = np.cov(trueS, S)
      k = S.shape[0]
      corr = np.zeros([k,k])
      for i in range(k):
          for j in range(k):
              corr[i][j] = cov[i + k][j]/np.sqrt(cov[i + k][i + k]*cov[j][j])
      arrangement = linear_sum_assignment(-corr)
      resS = np.zeros_like(S)
      resAT = np.zeros_like(A.T)
      for t in range(k):
          resS[arrangement[1][t]] = S[arrangement[0][t]]
          resAT[arrangement[1][t]] = A.T[arrangement[0][t]]
      return resAT.T, resS