ourMELONS/R/repmat.R

28 lines
1.3 KiB
R
Raw Normal View History

2019-12-17 10:53:59 +01:00
#' @title Repeat matrix
#' @description Repeats a matrix over n columns and rows
#' @details This function was created to replicate the behavior of a homonymous
#' function on Matlab
#' @param mx matrix
2020-01-14 16:37:00 +01:00
#' @param n either a scalar with the number of replications in both rows and columns or a 2-length vector with individual repetitions.
2019-12-17 10:53:59 +01:00
#' @return matrix replicated over `ncol(mx) * n` columns and `nrow(mx) * n` rows
#' @note The Matlab implementation of this function accepts `n` with length > 2.
2020-01-15 10:55:50 +01:00
#'
#' It should also be noted that a concatenated vector in R, e.g. `c(5, 2)`, becomes a column vector when coerced to matrix, even though it may look like a row vector at first glance. This is important to keep in mind when considering the expected output of this function. Vectors in R make sense to be seen as column vectors, given R's Statistics-oriented paradigm where variables are usually disposed as columns in a dataset.
2019-12-17 10:53:59 +01:00
#' @export
repmat <- function (mx, n) {
2020-01-15 10:55:50 +01:00
# Validation
2019-12-17 10:53:59 +01:00
if (length(n) > 2) warning("Extra dimensions of n ignored")
if (length(n) == 1) n <- rep(n, 2)
2020-01-15 10:55:50 +01:00
if (class(mx) != "matrix") mx <- as.matrix(mx)
# Replicating cols
out <- mx_col <- matrix(rep(mx, n[2]), nrow(mx))
# Replicating rows
if (n[1] > 1) {
for (i in seq(n[1] - 1)) out <- rbind(out, mx_col)
2019-12-17 10:53:59 +01:00
}
2020-01-15 10:55:50 +01:00
# Output
2019-12-17 10:53:59 +01:00
return(unname(as.matrix(out)))
}