; docformat = 'rst'

;+
; Create an `ncolumns` by `nrows` tiling of `arr`.
;
; :Returns:
;   2-dimensional array of the same type as `arr`
;
; :Params:
;   arr : in, required, type=numeric
;     scalar, 1-, or 2-dimensional numeric array
;   ncolumns : in, required, type=integer
;     number of horizontal tiles of `arr`
;   nrows : in, required, type=integer
;     number of vertical tiles of `arr`
;-
function mg_repmat, arr, ncolumns, nrows
  compile_opt strictarr
  on_error, 2

  if (n_params() lt 3L) then message, 'incorrect number of arguments'

  ndims = size(arr, /n_dimensions)
  if (ndims gt 2L) then message, 'input array must be at most 2-dimensional'

  _arr = ndims eq 0L ? [arr] : arr
  dims = lonarr(2) + 1L
  dims[0] = size(_arr, /dimensions)
  
  return, reform(transpose(rebin(reform(_arr, dims[0], dims[1], 1, 1), $
                                 dims[0], dims[1], ncolumns, nrows), $
                           [0, 2, 1, 3]), $
                 dims[0] * ncolumns, dims[1] * nrows)
end