You could declare a matrix much larger than you intend to use. This works with a few megabytes of data. It is not very efficient, so scaling up may become a problem. m22 <- matrix(NA, 1:600000, ncol=6) It does not work to add a new column to the matrix, as in you get an error if you try m22[ , 7] but convert to data frame and add a column m23 <- data.frame(m22) m23$x7 <- 12 The only penalty that I know of to having unused space in a matrix is the amount of memory it takes. One side effect is that your program may have a mistake that you would normally catch with a subscript out of bounds error but with the extra space it now runs without errors. Tim -----Original Message----- From: R-help <r-help-bounces at r-project.org> On Behalf Of Richard O'Keefe Sent: Thursday, February 29, 2024 5:29 AM To: Steven Yen <styen at ntu.edu.tw> Cc: R-help Mailing List <r-help at r-project.org> Subject: Re: [R] Initializing vector and matrices [External Email] x <- numeric(0) for (...) { x[length(x)+1] <- ... } works. You can build a matrix by building a vector one element at a time this way, and then reshaping it at the end. That only works if you don't need it to be a matrix at all times. Another approach is to build a list of rows. It's not a matrix, but a list of rows can be a *ragged* matrix with rows of varying length. On Wed, 28 Feb 2024 at 21:57, Steven Yen <styen at ntu.edu.tw> wrote:> > Is there as way to initialize a vector (matrix) with an unknown length > (dimension)? NULL does not seem to work. The lines below work with a > vector of length 4 and a matrix of 4 x 4. What if I do not know > initially the length/dimension of the vector/matrix? > > All I want is to add up (accumulate) the vector and matrix as I go > through the loop. > > Or, are there other ways to accumulate such vectors and matrices? > > > x<-rep(0,4) # this works but I like to leave the length open > > for (i in 1:3){ > + x1<-1:4 > + x<-x+x1 > + } > > x > [1] 3 6 9 12 > > > y = 0*matrix(1:16, nrow = 4, ncol = 4); # this works but I like to > leave the dimension open > [,1] [,2] [,3] [,4] > [1,] 0 0 0 0 > [2,] 0 0 0 0 > [3,] 0 0 0 0 > [4,] 0 0 0 0 > > for (i in 1:3){ > + y1<-matrix(17:32, nrow = 4, ncol = 4) > + y<-y+y1 > + } > > y > [,1] [,2] [,3] [,4] > [1,] 51 63 75 87 > [2,] 54 66 78 90 > [3,] 57 69 81 93 > [4,] 60 72 84 96 > > > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat/ > .ethz.ch%2Fmailman%2Flistinfo%2Fr-help&data=05%7C02%7Ctebert%40ufl.edu > %7Cdbccaccf29674b10b17308dc39114d38%7C0d4da0f84a314d76ace60a62331e1b84 > %7C0%7C0%7C638447993707432549%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAw > MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata> PtWjcDOnwO7PArVOSdgYbpz8ksjDPK%2Bn9ySyhwQC0gE%3D&reserved=0 > PLEASE do read the posting guide > http://www.r/ > -project.org%2Fposting-guide.html&data=05%7C02%7Ctebert%40ufl.edu%7Cdb > ccaccf29674b10b17308dc39114d38%7C0d4da0f84a314d76ace60a62331e1b84%7C0% > 7C0%7C638447993707438911%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiL > CJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=Igb16 > CBYgG21HLEDH4I4gfjjFBa3KjDFK8yEZUmBo8s%3D&reserved=0 > and provide commented, minimal, self-contained, reproducible code.______________________________________________ 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.
Thanks to all. Great ideas. I found Eik Vettorazzi's suggesstion easy to implrment: ebarm<-vbarm<-NULL ... if (is.null(ebarm)) ebarm<-ame.00$ei/k else ebarm<-ebarm+ame.00$ei/k if (is.null(vbarm)) vbarm<-ame.00$vi/k else vbarm<-vbarm+ame.00$vi/k ... Steven Yen On 2/29/2024 10:31 PM, Ebert,Timothy Aaron wrote:> You could declare a matrix much larger than you intend to use. This works with a few megabytes of data. It is not very efficient, so scaling up may become a problem. > m22 <- matrix(NA, 1:600000, ncol=6) > > It does not work to add a new column to the matrix, as in you get an error if you try m22[ , 7] but convert to data frame and add a column > > m23 <- data.frame(m22) > m23$x7 <- 12 > > The only penalty that I know of to having unused space in a matrix is the amount of memory it takes. One side effect is that your program may have a mistake that you would normally catch with a subscript out of bounds error but with the extra space it now runs without errors. > > Tim > > > > -----Original Message----- > From: R-help <r-help-bounces at r-project.org> On Behalf Of Richard O'Keefe > Sent: Thursday, February 29, 2024 5:29 AM > To: Steven Yen <styen at ntu.edu.tw> > Cc: R-help Mailing List <r-help at r-project.org> > Subject: Re: [R] Initializing vector and matrices > > [External Email] > > x <- numeric(0) > for (...) { > x[length(x)+1] <- ... > } > works. > You can build a matrix by building a vector one element at a time this way, and then reshaping it at the end. That only works if you don't need it to be a matrix at all times. > Another approach is to build a list of rows. It's not a matrix, but a list of rows can be a *ragged* matrix with rows of varying length. > > On Wed, 28 Feb 2024 at 21:57, Steven Yen <styen at ntu.edu.tw> wrote: >> Is there as way to initialize a vector (matrix) with an unknown length >> (dimension)? NULL does not seem to work. The lines below work with a >> vector of length 4 and a matrix of 4 x 4. What if I do not know >> initially the length/dimension of the vector/matrix? >> >> All I want is to add up (accumulate) the vector and matrix as I go >> through the loop. >> >> Or, are there other ways to accumulate such vectors and matrices? >> >> > x<-rep(0,4) # this works but I like to leave the length open > >> for (i in 1:3){ >> + x1<-1:4 >> + x<-x+x1 >> + } >> > x >> [1] 3 6 9 12 >> >> > y = 0*matrix(1:16, nrow = 4, ncol = 4); # this works but I like to >> leave the dimension open >> [,1] [,2] [,3] [,4] >> [1,] 0 0 0 0 >> [2,] 0 0 0 0 >> [3,] 0 0 0 0 >> [4,] 0 0 0 0 >> > for (i in 1:3){ >> + y1<-matrix(17:32, nrow = 4, ncol = 4) >> + y<-y+y1 >> + } >> > y >> [,1] [,2] [,3] [,4] >> [1,] 51 63 75 87 >> [2,] 54 66 78 90 >> [3,] 57 69 81 93 >> [4,] 60 72 84 96 >> > >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat/ >> .ethz.ch%2Fmailman%2Flistinfo%2Fr-help&data=05%7C02%7Ctebert%40ufl.edu >> %7Cdbccaccf29674b10b17308dc39114d38%7C0d4da0f84a314d76ace60a62331e1b84 >> %7C0%7C0%7C638447993707432549%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAw >> MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata>> PtWjcDOnwO7PArVOSdgYbpz8ksjDPK%2Bn9ySyhwQC0gE%3D&reserved=0 >> PLEASE do read the posting guide >> http://www.r/ >> -project.org%2Fposting-guide.html&data=05%7C02%7Ctebert%40ufl.edu%7Cdb >> ccaccf29674b10b17308dc39114d38%7C0d4da0f84a314d76ace60a62331e1b84%7C0% >> 7C0%7C638447993707438911%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiL >> CJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=Igb16 >> CBYgG21HLEDH4I4gfjjFBa3KjDFK8yEZUmBo8s%3D&reserved=0 >> and provide commented, minimal, self-contained, reproducible code. > ______________________________________________ > 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.
The matrix equivalent of x <- ... v <- ... x[length(x)+1] <- v is m <- ... r <- ... m <- rbind(m, r) or m <- ... k <- ... m <- cbind(m, c) A vector or matrix so constructed never has "holes" in it. It's better to think of CONSTRUCTING vectors and matrices rather than INITIALISING them, because always being fully defined is important. It would be really really helpful to have a clearer idea of what you are trying to do. On Fri, 1 Mar 2024 at 03:31, Ebert,Timothy Aaron <tebert at ufl.edu> wrote:> > You could declare a matrix much larger than you intend to use. This works with a few megabytes of data. It is not very efficient, so scaling up may become a problem. > m22 <- matrix(NA, 1:600000, ncol=6) > > It does not work to add a new column to the matrix, as in you get an error if you try m22[ , 7] but convert to data frame and add a column > > m23 <- data.frame(m22) > m23$x7 <- 12 > > The only penalty that I know of to having unused space in a matrix is the amount of memory it takes. One side effect is that your program may have a mistake that you would normally catch with a subscript out of bounds error but with the extra space it now runs without errors. > > Tim > > > > -----Original Message----- > From: R-help <r-help-bounces at r-project.org> On Behalf Of Richard O'Keefe > Sent: Thursday, February 29, 2024 5:29 AM > To: Steven Yen <styen at ntu.edu.tw> > Cc: R-help Mailing List <r-help at r-project.org> > Subject: Re: [R] Initializing vector and matrices > > [External Email] > > x <- numeric(0) > for (...) { > x[length(x)+1] <- ... > } > works. > You can build a matrix by building a vector one element at a time this way, and then reshaping it at the end. That only works if you don't need it to be a matrix at all times. > Another approach is to build a list of rows. It's not a matrix, but a list of rows can be a *ragged* matrix with rows of varying length. > > On Wed, 28 Feb 2024 at 21:57, Steven Yen <styen at ntu.edu.tw> wrote: > > > > Is there as way to initialize a vector (matrix) with an unknown length > > (dimension)? NULL does not seem to work. The lines below work with a > > vector of length 4 and a matrix of 4 x 4. What if I do not know > > initially the length/dimension of the vector/matrix? > > > > All I want is to add up (accumulate) the vector and matrix as I go > > through the loop. > > > > Or, are there other ways to accumulate such vectors and matrices? > > > > > x<-rep(0,4) # this works but I like to leave the length open > > > for (i in 1:3){ > > + x1<-1:4 > > + x<-x+x1 > > + } > > > x > > [1] 3 6 9 12 > > > > > y = 0*matrix(1:16, nrow = 4, ncol = 4); # this works but I like to > > leave the dimension open > > [,1] [,2] [,3] [,4] > > [1,] 0 0 0 0 > > [2,] 0 0 0 0 > > [3,] 0 0 0 0 > > [4,] 0 0 0 0 > > > for (i in 1:3){ > > + y1<-matrix(17:32, nrow = 4, ncol = 4) > > + y<-y+y1 > > + } > > > y > > [,1] [,2] [,3] [,4] > > [1,] 51 63 75 87 > > [2,] 54 66 78 90 > > [3,] 57 69 81 93 > > [4,] 60 72 84 96 > > > > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > https://stat/ > > .ethz.ch%2Fmailman%2Flistinfo%2Fr-help&data=05%7C02%7Ctebert%40ufl.edu > > %7Cdbccaccf29674b10b17308dc39114d38%7C0d4da0f84a314d76ace60a62331e1b84 > > %7C0%7C0%7C638447993707432549%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAw > > MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata> > PtWjcDOnwO7PArVOSdgYbpz8ksjDPK%2Bn9ySyhwQC0gE%3D&reserved=0 > > PLEASE do read the posting guide > > http://www.r/ > > -project.org%2Fposting-guide.html&data=05%7C02%7Ctebert%40ufl.edu%7Cdb > > ccaccf29674b10b17308dc39114d38%7C0d4da0f84a314d76ace60a62331e1b84%7C0% > > 7C0%7C638447993707438911%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiL > > CJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=Igb16 > > CBYgG21HLEDH4I4gfjjFBa3KjDFK8yEZUmBo8s%3D&reserved=0 > > and provide commented, minimal, self-contained, reproducible code. > > ______________________________________________ > 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.