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