[R] create block diagonal with each rows

arun smartpink111 at yahoo.com
Thu Jan 17 18:59:04 CET 2013


Hi,

I tried with kronecker()
do.call(rbind,lapply(1:4,function(i) t(kronecker(diag(4), x[i,]))[i,]))
  # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,]    1    5    9   13   17    0    0    0    0     0     0     0     0     0
#[2,]    0    0    0    0    0    2    6   10   14    18     0     0     0     0
#[3,]    0    0    0    0    0    0    0    0    0     0     3     7    11    15
#[4,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  #   [,15] [,16] [,17] [,18] [,19] [,20]
#[1,]     0     0     0     0     0     0
#[2,]     0     0     0     0     0     0
#[3,]    19     0     0     0     0     0
#[4,]     0     4     8    12    16    20


Not sure if there are any shortcuts with kronecker()
A.K.





----- Original Message -----
From: Martin Maechler <maechler at stat.math.ethz.ch>
To: arun <smartpink111 at yahoo.com>
Cc: Kathryn Lord <kathryn.lord2000 at gmail.com>; R help <r-help at r-project.org>
Sent: Thursday, January 17, 2013 12:18 PM
Subject: Re: [R] create block diagonal with each rows

>>>>> arun  <smartpink111 at yahoo.com>
>>>>>     on Wed, 16 Jan 2013 19:20:46 -0800 writes:

    > Hi,
    > May be this helps:
    > library(Matrix)
    > res1<-lapply(split(x,1:nrow(x)),function(y) sparseMatrix(i=rep(1:4,each=5),j=1:(4*5),x=y))
    >  do.call(rbind,lapply(seq_along(res1),function(i) res1[[i]][i,]))
    > #     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
    > #[1,]    1    5    9   13   17    0    0    0    0     0     0     0     0     0
    > #[2,]    0    0    0    0    0    2    6   10   14    18     0     0     0     0
    > #[3,]    0    0    0    0    0    0    0    0    0     0     3     7    11    15
    > #[4,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
    > #     [,15] [,16] [,17] [,18] [,19] [,20]
    > #[1,]     0     0     0     0     0     0
    > #[2,]     0     0     0     0     0     0
    > #[3,]    19     0     0     0     0     0
    > #[4,]     0     4     8    12    16    20

Thank you for thinking of  Matrix  (the package, not the movie)
here.

If you do,

>  x <- matrix(1:20, 4,5)
>  require(Matrix)

the following is  "a tiny bit"  nicer, using the  bdiag()
function which has been written to create block diagonal matrices.

> t(bdiag(split(x,1:nrow(x))))

4 x 20 sparse Matrix of class "dgCMatrix"
                                                      
[1,] 1 5 9 13 17 . .  .  .  . . .  .  .  . . .  .  .  .
[2,] . . .  .  . 2 6 10 14 18 . .  .  .  . . .  .  .  .
[3,] . . .  .  . . .  .  .  . 3 7 11 15 19 . .  .  .  .
[4,] . . .  .  . . .  .  .  . . .  .  .  . 4 8 12 16 20
> 

and if you don't want a sparse matrix for some reason,
    (and think twice: it may be more efficient to keep it !)
you wrap the result with a 

    as.matrix(  <result>  )

---
Martin Maechler, ETH Zurich
    




    > ----- Original Message -----
    > From: Kathryn Lord <kathryn.lord2000 at gmail.com>
    > To: r-help <r-help at r-project.org>
    > Cc: 
    > Sent: Wednesday, January 16, 2013 9:11 PM
    > Subject: [R] create block diagonal with each rows

    > Dear R users,

    > I'd like to create a block diagonal matrix with each rows in a matrix.

    > Here is a simple example. (In fact, the matrix is big)


    > x <- matrix(1:20, 4,5)

    >> x
    >      [,1] [,2] [,3] [,4] [,5]
    > [1,]    1    5    9   13   17
    > [2,]    2    6   10   14   18
    > [3,]    3    7   11   15   19
    > [4,]    4    8   12   16   20


    > With each rows in matrix x, I'd like to make the matrix below.


    >      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9][,10]
    > [,11][,12][,13][,14][,15][,16][,17][,18][,19][,20]
    > [1,]    1    5    9   13   17   0    0    0    0    0     0    0    0
    > 0    0     0    0    0    0    0
    > [2,]    0    0    0    0    0    2    6   10   14   18   0    0    0
    > 0    0     0    0    0    0    0
    > [3,]    0    0    0    0    0    0    0    0    0    0     3    7   11
    > 15   19   0    0    0    0    0
    > [4,]    0    0    0    0    0    0    0    0    0    0     0    0    0
    > 0    0     4    8   12   16   20


    > Any suggestion will be greatly appreciated.

    > Best,

    > Kathryn Lord

    >     [[alternative HTML version deleted]]

    > ______________________________________________
    > R-help at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-help
    > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
    > and provide commented, minimal, self-contained, reproducible code.


    > ______________________________________________
    > R-help at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-help
    > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
    > and provide commented, minimal, self-contained, reproducible code.




More information about the R-help mailing list