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 >
OK. I initialize real large vector and matrix and then shrink them when I use them in the loop. The following lines worked. I'd glad to know of better approaches. bsum<-rep(0,1000); bsum vsum<-matrix(rep(0,1000000),nrow=1000); vsum for (ind in 1:3) { mydata <- read.csv(paste0("midata", ind, ".csv")) ... k<-length(ame.00$bame) bsum<-bsum[1:k]+ame.00$bame vsum<-vsum[1:k,1:k]+ame.00$vame } On 2/28/2024 4:56 PM, Steven Yen 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 > > > >
Hi Steven, It's not entirely clear what you actually want to achieve in the end. As soon as you "know" x1, and assuming that the different "xi" do not differ in length in the real application, you know the length of the target vector. Instead of the loop, you can use 'Reduce' without having to initialize a starting vector. # generate sample vectors, put them in a list xi<-lapply(1:5, \(x)sample(5)) # look at xi xi # sum over xi Reduce("+",xi) this works also for matrices # generate sample matrices, put them in a list Xi<-lapply(1:3, \(x)matrix(sample(16), nrow=4)) # look at them Xi # sum over Xi Reduce("+",Xi) Hope that helps Eik Am 28.02.2024 um 09:56 schrieb Steven Yen:> 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/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.-- Eik Vettorazzi Universit?tsklinikum Hamburg-Eppendorf Institut f?r Medizinische Biometrie und Epidemiologie Christoph-Probst-Weg 1 4. Obergeschoss, Raum 04.1.021.1 20246 Hamburg Telefon: +49 (0) 40 7410 - 58243 Fax: +49 (0) 40 7410 - 57790 Web: www.uke.de/imbe Webex: https://webteaching-uke.webex.com/meet/e.vettorazzi -- _____________________________________________________________________ Universit?tsklinikum Hamburg-Eppendorf; K?rperschaft des ?ffentlichen Rechts; Gerichtsstand: Hamburg | www.uke.de Vorstandsmitglieder: Prof. Dr. Christian Gerloff (Vorsitzender), Joachim Pr?l?, Prof. Dr. Blanche Schwappach-Pignataro, Matthias Waldmann (komm.) _____________________________________________________________________ SAVE PAPER - THINK BEFORE PRINTING
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/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.