polar

tenpy.linalg.np_conserved.polar(a, cutoff=1e-16, left=False, inner_labels=[None, None])[source]

Polar decomposition of an Array a.

Factorizes u * p = a (left=False) or p * u = a (left=True), such that a = U*diag(S)*VH (where * stands for a tensordot() and diag creates an correctly shaped Array with S on the diagonal). For a non-zero cutoff this holds only approximately.

There is a gauge freedom regarding the charges, see also Array.gauge_total_charge(). We ensure contractibility by setting U.legs[1] = VH.legs[0].conj(). Further, we gauge the LegCharge such that U and V have the desired qtotal_LR.

Parameters:
  • a ((M, N) Array) – Matrix to be pseudo-inverted.

  • cutoff (float) – Cutoff for small singular values, as given to svd(). (Note: different convention than numpy.)

Returns:

B – The pseudo-inverse of a.

Return type:

(N, M) Array