Dear R users, Suppose that I have a matrix A A <- matrix(c(1,2,3,4),2,2)> A[,1] [,2] [1,] 1 3 [2,] 2 4 With this matrix A, I'd like to create bigger one, for example, [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [1,] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 [2,] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 [3,] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 [4,] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 [5,] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 [6,] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 [7,] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 [8,] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 [9,] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 [10,] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 [11,] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 [12,] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 [13,] 1 3 1 3 1 3 1 3 1 3 1 3 1 3 [14,] 2 4 2 4 2 4 2 4 2 4 2 4 2 4 In fact, I want much bigger one. I wonder if there is an elegant way to do this? Any suggestions? Thank you! Best wishes and Happy new year Kathie [[alternative HTML version deleted]]
David Winsemius
2015-Dec-31 21:05 UTC
[R] create one bigger matrix with one smaller matrix
> On Dec 31, 2015, at 12:28 PM, Kathryn Lord <kathryn.lord2000 at gmail.com> wrote: > > Dear R users, > > Suppose that I have a matrix A > > A <- matrix(c(1,2,3,4),2,2) >> A > [,1] [,2] > [1,] 1 3 > [2,] 2 4 > > With this matrix A, I'd like to create bigger one, for example, > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] > [,14] > [1,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [2,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [3,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [4,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [5,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [6,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [7,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [8,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [9,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [10,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [11,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [12,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [13,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [14,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > >str( do.call('rbind', rep(list( do.call('cbind' , rep(list(A), 20) ) ), 20) ) ) #result num [1:40, 1:40] 1 2 1 2 1 2 1 2 1 2 ... The "upper left" corner: do.call('rbind', rep(list( do.call('cbind' , rep(list(A), 20) ) ), 20) )[1:10, 1:10] [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 3 1 3 1 3 1 3 1 3 [2,] 2 4 2 4 2 4 2 4 2 4 [3,] 1 3 1 3 1 3 1 3 1 3 [4,] 2 4 2 4 2 4 2 4 2 4 [5,] 1 3 1 3 1 3 1 3 1 3 [6,] 2 4 2 4 2 4 2 4 2 4 [7,] 1 3 1 3 1 3 1 3 1 3 [8,] 2 4 2 4 2 4 2 4 2 4 [9,] 1 3 1 3 1 3 1 3 1 3 [10,] 2 4 2 4 2 4 2 4 2 4> In fact, I want much bigger one. I wonder if there is an elegant way to do > this? > > Any suggestions? Thank you! > > Best wishes and Happy new year > > Kathie > > [[alternative HTML version deleted]]Your use of HTML for email is not appropriate for this list. It messed up your example although the intent was not that difficult to discrn. -- David.> > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.David Winsemius Alameda, CA, USA
Something like: A <- matrix(c(1,2,3,4),2,2) A B <- matrix(rep(A, 4), nrow=2) B C <- do.call(rbind, lapply(1:8, function(x) B)) C On Thu, Dec 31, 2015 at 12:28 PM, Kathryn Lord <kathryn.lord2000 at gmail.com> wrote:> Dear R users, > > Suppose that I have a matrix A > > A <- matrix(c(1,2,3,4),2,2) >> A > [,1] [,2] > [1,] 1 3 > [2,] 2 4 > > With this matrix A, I'd like to create bigger one, for example, > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] > [,14] > [1,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [2,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [3,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [4,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [5,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [6,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [7,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [8,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [9,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [10,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [11,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [12,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [13,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [14,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > > > In fact, I want much bigger one. I wonder if there is an elegant way to do > this? > > Any suggestions? Thank you! > > Best wishes and Happy new year > > Kathie > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.
Well, all of the solutions proposed are a bit tricky in that the matrix must be "constructed" by hand. They are also reinventing wheels. What I think you really want is the kronecker product, which is the matrix operation that does exactly what you want. e.g. A <- matrix(1:4, nr=2) to create a new matrix with e.g. 2 x 6 "positions" in each of which is A, simply do kronecker (matrix(1, nr = 2, nc=6), A) or if you want to use the operator form: matrix(1,nr=2, nc=6) %x% A See ?kronecker Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Thu, Dec 31, 2015 at 12:28 PM, Kathryn Lord <kathryn.lord2000 at gmail.com> wrote:> Dear R users, > > Suppose that I have a matrix A > > A <- matrix(c(1,2,3,4),2,2) >> A > [,1] [,2] > [1,] 1 3 > [2,] 2 4 > > With this matrix A, I'd like to create bigger one, for example, > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] > [,14] > [1,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [2,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [3,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [4,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [5,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [6,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [7,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [8,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [9,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [10,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [11,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [12,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > [13,] 1 3 1 3 1 3 1 3 1 3 1 3 > 1 3 > [14,] 2 4 2 4 2 4 2 4 2 4 2 4 > 2 4 > > > In fact, I want much bigger one. I wonder if there is an elegant way to do > this? > > Any suggestions? Thank you! > > Best wishes and Happy new year > > Kathie > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.