def perform_lu(self):
        if self._lu is not None:
            return self._lu
        ndim = self.tpmats[0].dimensions
        self._lu = {}
        if ndim == 2:
            self._lu[0] = splu(self.mats2D[0], permc_spec=config['matrix']['sparse']['permc_spec'])
        else:
            diagonal_axis = self.get_diagonal_axis()
            for i in range(self.T.shape(True)[diagonal_axis]):
                self._lu[i] = splu(self.mats2D[i], permc_spec=config['matrix']['sparse']['permc_spec'])
        return self._lu