code: public static ComplexDoubleMatrix[] sparseSVD(ComplexDoubleMatrix A) {
          int m = A.rows;
          int n = A.columns;
  
          ComplexDoubleMatrix U = new ComplexDoubleMatrix(m, min(m, n));
          DoubleMatrix S = new DoubleMatrix(min(m, n));
          ComplexDoubleMatrix V = new ComplexDoubleMatrix(min(m, n), n);
  
          double[] rwork = new double[5*min(m,n)];
  
          int info = NativeBlas.zgesvd('S', 'S', m, n, A.dup().data, 0, m, S.data, 0, U.data, 0, m, V.data, 0, min(m, n), rwork, 0);
  
          if (info > 0) {
            throw new LapackConvergenceException("GESVD", info + " superdiagonals of an intermediate bidiagonal form failed to converge.");
          }
  
          return new ComplexDoubleMatrix[]{U, new ComplexDoubleMatrix(S), V.hermitian()};
      }
docs: Compute a singular-value decomposition of A (sparse variant).
  Sparse means that the matrices U and V are not square but only have
  as many columns (or rows) as necessary.
  
  @param A
  @return A ComplexDoubleMatrix[3] array of U, S, V such that A = U * diag(S) * V*