docs: def real(self):
          """Element-wise real part
  
          Raises:
              NoConjugateMatrix: if entries have no `conjugate` method and no
                  other way to determine the real part
  
          Note:
              A mathematically equivalent way to obtain a real matrix from a
              complex matrix ``M`` is::
  
                  (M.conjugate() + M) / 2
  
              However, the result may not be identical to ``M.real``, as the
              latter tries to convert elements of the matrix to real values
              directly, if possible, and only uses the conjugate as a fall-back
          """
  
          def re(val):
              if hasattr(val, 'real'):
                  return val.real
              elif hasattr(val, 'as_real_imag'):
                  return val.as_real_imag()[0]
              elif hasattr(val, 'conjugate'):
                  return (val.conjugate() + val) / 2
              else:
                  raise NoConjugateMatrix(
                      "Matrix entry %s contains has no defined "
                      "conjugate" % str(val))
  
          # Note: Do NOT use self.matrix.real! This will give wrong results, as
          # numpy thinks of objects (Operators) as real, even if they have no
          # defined real part
          return self.element_wise(re)