[R] a trick ??

Ben Bolker
Tue, 26 Feb 2002 19:12:00 -0000

A more general solution (given a list of matrices [with any
dimensions] blockdiag(a1,a2,a3) gives the block diagonal concatenation of
the matrices).  I don't know if "kronecker" can do this or not.


blockdiag <- function(...) {
  args <- list(...)
  nr <- sapply(args,nrow)
  nc <- sapply(args,ncol)
  cumnc <- cumsum(nc)
  NR <- sum(nr)
  NC <- sum(nc)
  rowfun <- function(m,zbefore,zafter) {
    cbind(matrix(0,ncol=zbefore,nrow=nrow(m)),m,
          matrix(0,ncol=zafter,nrow=nrow(m)))
  }
  ret <- rowfun(args[[1]],0,NC-ncol(args[[1]]))
  for (i in 2:length(args)) {
    ret <- rbind(ret,rowfun(args[[i]],cumnc[i-1],NC-cumnc[i]))
  }
  ret
}


On Tue, 26 Feb 2002, Olivier Martin wrote:

> Dear R users,
>
> Suppose i have an A square matrix rxr. I want to obtain a block matrix
> B (pxr,pxr) where
> the p diagonal blocks are A and  the others values are 0.
> I would like to do something like : diag(A,ncol=pr, nrow=pr)
> How can i do it ??
> Thanks in advance,
> Olivier.
>
> --
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> Olivier MARTIN
> PhD student                  phone: (33) 04 76 61 53 55
> Projet IS2                               06 08 67 93 42
> INRIA Rhone-Alpes            fax  : (33) 04 76 61 54 77
> 655, Av. de l'Europe
> Montbonnot                   e-mail:olivier.martin at inrialpes.fr
> 38334 Saint Ismier cedex
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
>
>
>

--
318 Carr Hall                                bolker at zoo.ufl.edu
Zoology Department, University of Florida    http://www.zoo.ufl.edu/bolker
Box 118525                                   (ph)  352-392-5697
Gainesville, FL 32611-8525                   (fax) 352-392-3704