1##' Combine matrices to block diagonal structure 2##' @title Combine matrices to block diagonal structure 3##' @param x Matrix 4##' @param \dots Additional matrices 5##' @param pad Vyalue outside block-diagonal 6##' @author Klaus K. Holst 7##' @export 8##' @examples 9##' A <- diag(3)+1 10##' blockdiag(A,A,A,pad=NA) 11blockdiag <- function(x,...,pad=0) { 12 if (is.list(x)) xx <- x else xx <- list(x,...) 13 rows <- unlist(lapply(xx,nrow)) 14 crows <- c(0,cumsum(rows)) 15 cols <- unlist(lapply(xx,ncol)) 16 ccols <- c(0,cumsum(cols)) 17 res <- matrix(pad,nrow=sum(rows),ncol=sum(cols)) 18 for (i in seq_len(length(xx))) { 19 idx1 <- seq_len(rows[i])+crows[i]; idx2 <- seq_len(cols[i])+ccols[i] 20 res[idx1,idx2] <- xx[[i]] 21 } 22 colnames(res) <- unlist(lapply(xx,colnames)); rownames(res) <- unlist(lapply(xx,rownames)) 23 return(res) 24} 25