code: def matrix_decomp(self, cache=None):
          
          # Lazy import to improve `import odl` time
          import scipy.linalg
          import scipy.sparse
  
          # TODO: fix dead link `scipy.linalg.decomp.eigh`
          if scipy.sparse.isspmatrix(self.matrix):
              raise NotImplementedError('sparse matrix not supported')
  
          if cache is None:
              cache = self._cache_mat_decomp
  
          if self._eigval is None or self._eigvec is None:
              eigval, eigvec = scipy.linalg.eigh(self.matrix)
              if cache:
                  self._eigval = eigval
                  self._eigvec = eigvec
          else:
              eigval, eigvec = self._eigval, self._eigvec
  
          return eigval, eigvec
docs: Compute a Hermitian eigenbasis decomposition of the matrix.
  
          Parameters
          ----------
          cache : bool or None, optional
              If ``True``, store the decomposition internally. For None,
              the ``cache_mat_decomp`` from class initialization is used.
  
          Returns
          -------
          eigval : `numpy.ndarray`
              One-dimensional array of eigenvalues. Its length is equal
              to the number of matrix rows.
          eigvec : `numpy.ndarray`
              Two-dimensional array of eigenvectors. It has the same shape
              as the decomposed matrix.
  
          See Also
          --------
          scipy.linalg.decomp.eigh :
              Implementation of the decomposition. Standard parameters
              are used here.
  
          Raises
          ------
          NotImplementedError
              if the matrix is sparse (not supported by scipy 0.17)