code: def concat(mats):
      
      for mat in mats:
          if mat.isdiagonal:
              raise NotImplementedError("concat not supported for diagonal mats")
  
      row_match = True
      col_match = True
      for mat in mats[1:]:
          if sorted(mats[0].row_names) != sorted(mat.row_names):
              row_match = False
          if sorted(mats[0].col_names) != sorted(mat.col_names):
              col_match = False
      if not row_match and not col_match:
          raise Exception("mat_handler.concat(): all Matrix objects"+\
                          "must share either rows or cols")
  
      if row_match and col_match:
          raise Exception("mat_handler.concat(): all Matrix objects"+\
                          "share both rows and cols")
  
      if row_match:
          row_names = copy.deepcopy(mats[0].row_names)
          col_names = []
          for mat in mats:
              col_names.extend(copy.deepcopy(mat.col_names))
          x = mats[0].newx.copy()
          for mat in mats[1:]:
              mat.align(mats[0].row_names, axis=0)
              other_x = mat.newx
              x = np.append(x, other_x, axis=1)
  
      else:
          col_names = copy.deepcopy(mats[0].col_names)
          row_names = []
          for mat in mats:
              row_names.extend(copy.deepcopy(mat.row_names))
          x = mats[0].newx.copy()
          for mat in mats[1:]:
              mat.align(mats[0].col_names, axis=1)
              other_x = mat.newx
              x = np.append(x, other_x, axis=0)
      return Matrix(x=x, row_names=row_names, col_names=col_names)
docs: Concatenate Matrix objects.  Tries either axis.
  
      Parameters
      ----------
      mats: list
          list of Matrix objects
  
      Returns
      -------
      Matrix : Matrix