I'd like to have a three dimensional array of matrices. I thought I could construct a five dimensional array to have the three dimensional array of matrices. However, not all of the matrices in the array have the same dimensions, which seems to mean I can't use a five dimensional array. What I'd like is this: A = matrix(1:4,2,2) B = matrix(1:25,5,5) C = matrix(1,3,3) D = matrix(1,4,4) I'd like to construct an array for which, if I type F[1,1], it returns matrix A, type F[1,2] and it returns B, type F[2,1] and it returns C, or type F[2,2] and it returns D. Essentially, I'd like to be able to access them like they were elements of a matrix. Although this example is only a two dimensional array of matrices, I'd like it to also work with three dimensions also. The only thing I thought of to try was to make an array of lists and store the matrices inside of an array of lists (where each matrix is stored as a list with one item). Any suggestions? -Scott
Create a matrix of list:> A = matrix(1:4,2,2) > B = matrix(1:25,5,5) > C = matrix(1,3,3) > D = matrix(1,4,4) > x <- list(A,B,C,D) > dim(x) <- c(2,2) > x[[1,1]][,1] [,2] [1,] 1 3 [2,] 2 4> x[[2,2]][,1] [,2] [,3] [,4] [1,] 1 1 1 1 [2,] 1 1 1 1 [3,] 1 1 1 1 [4,] 1 1 1 1 On 5/21/07, Scott Hyde <hydes@byuh.edu> wrote:> > > I'd like to have a three dimensional array of matrices. I thought I > could construct a five dimensional array to have the three dimensional array > of matrices. However, not all of the matrices in the array have the same > dimensions, which seems to mean I can't use a five dimensional array. > > What I'd like is this: > > A = matrix(1:4,2,2) > B = matrix(1:25,5,5) > C = matrix(1,3,3) > D = matrix(1,4,4) > > I'd like to construct an array for which, if I type F[1,1], it returns > matrix A, type F[1,2] and it returns B, type F[2,1] and it returns C, or > type F[2,2] and it returns D. > > Essentially, I'd like to be able to access them like they were elements of > a matrix. Although this example is only a two dimensional array of > matrices, I'd like it to also work with three dimensions also. > > The only thing I thought of to try was to make an array of lists and store > the matrices inside of an array of lists (where each matrix is stored as a > list with one item). > > Any suggestions? > > -Scott > > ______________________________________________ > R-help@stat.math.ethz.ch 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. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve? [[alternative HTML version deleted]]
Scott Hyde napsal(a):> I'd like to have a three dimensional array of matrices. I thought I could construct a five dimensional array to have the three dimensional array of matrices. However, not all of the matrices in the array have the same dimensions, which seems to mean I can't use a five dimensional array. > > What I'd like is this: > > A = matrix(1:4,2,2) > B = matrix(1:25,5,5) > C = matrix(1,3,3) > D = matrix(1,4,4) > > I'd like to construct an array for which, if I type F[1,1], it returns matrix A, type F[1,2] and it returns B, type F[2,1] and it returns C, or type F[2,2] and it returns D. > > Essentially, I'd like to be able to access them like they were elements of a matrix. Although this example is only a two dimensional array of matrices, I'd like it to also work with three dimensions also. > > The only thing I thought of to try was to make an array of lists and store the matrices inside of an array of lists (where each matrix is stored as a list with one item).Too complicated. Making it the other way around, i.e. a list of matrices, is much cleaner. You can then access the individual matrices using '[[', e.g. F[[23]]. I don't know why (if even) you need the matrix-like indexing but if you really do, you can create an array of indeces like this: ind.arr <- matrix(1:25, ncol=5, byrow=TRUE) F[[(ind.arr[5,3])]]#is the same as F[[23]] above if F-matrix were 5x5. Petr> > Any suggestions? > > -Scott > > ______________________________________________ > R-help at stat.math.ethz.ch 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. >-- Petr Klasterecky Dept. of Probability and Statistics Charles University in Prague Czech Republic
Thanks for the replies Jim and Petr! I decided to do it a slightly different way. Using Jim's method, the matrices needed to be created before the array, whereas I needed the array to be allocated first, and then filled. Here's how I did it: This command creates a blank array of lists> y=array(list(),c(i,j,k))Then each item can be accessed (and assigned) using> y[[i,j,k]]For example:> for (i in 1:2)+ for (j in 1:2) + for (k in 1:2) + y[[i,j,k]] <- diag(i+j+k)> y, , 1 [,1] [,2] [1,] Numeric,9 Numeric,16 [2,] Numeric,16 Numeric,25 , , 2 [,1] [,2] [1,] Numeric,16 Numeric,25 [2,] Numeric,25 Numeric,36> y[[1,1,1]][,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1> y[[2,1,2]][,1] [,2] [,3] [,4] [,5] [1,] 1 0 0 0 0 [2,] 0 1 0 0 0 [3,] 0 0 1 0 0 [4,] 0 0 0 1 0 [5,] 0 0 0 0 1 Thanks again for the help! -Scott ---- Original message ---->Date: Mon, 21 May 2007 04:57:40 -0400 >From: "jim holtman" <jholtman at gmail.com> >Subject: Re: [R] an array of matrices >To: "Scott Hyde" <hydes at byuh.edu> >Cc: r-help at stat.math.ethz.ch > > Create a matrix of list: > > > A = matrix(1:4,2,2) > > B = matrix(1:25,5,5) > > C = matrix(1,3,3) > > D = matrix(1,4,4) > > x <- list(A,B,C,D) > > dim(x) <- c(2,2) > > x[[1,1]] > [,1] [,2] > [1,] 1 3 > [2,] 2 4 > > x[[2,2]] > [,1] [,2] [,3] [,4] > [1,] 1 1 1 1 > [2,] 1 1 1 1 > [3,] 1 1 1 1 > [4,] 1 1 1 1 > > > On 5/21/07, Scott Hyde <hydes at byuh.edu> wrote: > > I'd like to have a three dimensional array of > matrices. I thought I could construct a five > dimensional array to have the three dimensional > array of matrices. However, not all of the > matrices in the array have the same dimensions, > which seems to mean I can't use a five dimensional > array. > > What I'd like is this: > > A = matrix(1:4,2,2) > B = matrix(1:25,5,5) > C = matrix(1,3,3) > D = matrix(1,4,4) > > I'd like to construct an array for which, if I > type F[1,1], it returns matrix A, type F[1,2] and > it returns B, type F[2,1] and it returns C, or > type F[2,2] and it returns D. > > Essentially, I'd like to be able to access them > like they were elements of a matrix. Although > this example is only a two dimensional array of > matrices, I'd like it to also work with three > dimensions also. > > The only thing I thought of to try was to make an > array of lists and store the matrices inside of an > array of lists (where each matrix is stored as a > list with one item). > > Any suggestions? > > -Scott > > ______________________________________________ > R-help at stat.math.ethz.ch 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. > > -- > Jim Holtman > Cincinnati, OH > +1 513 646 9390 > > What is the problem you are trying to solve?