*Rでrepmat

d.hatena.ne.jp/a_bicky/20100509/1273385433より

repmat <- function(A, m, n = m) { if(missing(m)) stop("Requires at least 2 inputs.") if(is.vector(A)) A <- t(matrix(A)) d <- dim(A) nr <- d[1] nc <- d[2] if(length(m) <= 2) { m[2] <- ifelse(is.na(m[2]), n, m[2]) if(length(d) > 2) { ## 2次元になるまで再帰で次元を削減 ret <- array(dim = c(nr * m[1], nc * m[2], d[-(1:2)])) for(i in 1:d[length(d)]){ sep <- paste(rep(",", length(d) - 1), collapse="") eval(parse(text = sprintf("ret[%si] <- repmat(A[%si], m[1], m[2])", sep, sep))) } } else { tmpA <- matrix(rep(t(A), m[1]), nrow = nr * m[1], byrow = TRUE) return(matrix(rep(tmpA, m[2]), nrow = nr * m[1], ncol = nc * m[2])) } ret } else { if(length(d) > 2) stop("Doesn't support these arguments.") # MATLABではサポートされている tmpA <- matrix(rep(t(A), m[1]), nrow = nr * m[1], byrow = TRUE) tmpA <- matrix(rep(tmpA, m[2]), nrow = nr * m[1], ncol = nc * m[2]) array(rep(tmpA, prod(m[-(1:2)])), c(nr * m[1], nc * m[2], m[-(1:2)])) }}