Hello! I have a matrix x and a vector y: x <- matrix(1:6, ncol = 2) y <- c(2,3) I need to multiply the first column of x by 2 (y[1]) and the second column of x by 3 (y[2]). Of course, I could do this - but it's column by column: x[,1] <- x[,1] * y[1] x[,2] <- x[,2] * y[2] x Or I could repeat each element of y and multiply two matrices - that's better: rep.row<-function(x,n){ matrix(rep(x,each=n),nrow=n) } y <- rep.row(y, nrow(x)) x * y However, maybe there is a more elegant r-like way of doing it? Thank you! -- Dimitri Liakhovitski
Hello, Take advantage that in R '*' recycles its arguments (the shorter one) and that the operation is performed column-wise: t(y * t(x)) Hope this helps, Rui Barradas Em 03-11-2016 21:05, Dimitri Liakhovitski escreveu:> Hello! > > I have a matrix x and a vector y: > > x <- matrix(1:6, ncol = 2) > y <- c(2,3) > > I need to multiply the first column of x by 2 (y[1]) and the second > column of x by 3 (y[2]). > > Of course, I could do this - but it's column by column: > > x[,1] <- x[,1] * y[1] > x[,2] <- x[,2] * y[2] > x > > Or I could repeat each element of y and multiply two matrices - that's better: > > rep.row<-function(x,n){ > matrix(rep(x,each=n),nrow=n) > } > y <- rep.row(y, nrow(x)) > x * y > > However, maybe there is a more elegant r-like way of doing it? > Thank you! >
Like this?> sweep(x, 2, y, "*")[,1] [,2] [1,] 2 12 [2,] 4 15 [3,] 6 18>On Thu, Nov 3, 2016 at 5:05 PM, Dimitri Liakhovitski <dimitri.liakhovitski at gmail.com> wrote:> Hello! > > I have a matrix x and a vector y: > > x <- matrix(1:6, ncol = 2) > y <- c(2,3) > > I need to multiply the first column of x by 2 (y[1]) and the second > column of x by 3 (y[2]). > > Of course, I could do this - but it's column by column: > > x[,1] <- x[,1] * y[1] > x[,2] <- x[,2] * y[2] > x > > Or I could repeat each element of y and multiply two matrices - that's better: > > rep.row<-function(x,n){ > matrix(rep(x,each=n),nrow=n) > } > y <- rep.row(y, nrow(x)) > x * y > > However, maybe there is a more elegant r-like way of doing it? > Thank you! > > -- > Dimitri Liakhovitski >-- Sarah Goslee http://www.functionaldiversity.org
My goodness!> x %*% diag(y)[,1] [,2] [1,] 2 12 [2,] 4 15 [3,] 6 18 will do. -- Bert 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, Nov 3, 2016 at 2:33 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote:> Like this? > >> sweep(x, 2, y, "*") > [,1] [,2] > [1,] 2 12 > [2,] 4 15 > [3,] 6 18 >> > > > On Thu, Nov 3, 2016 at 5:05 PM, Dimitri Liakhovitski > <dimitri.liakhovitski at gmail.com> wrote: >> Hello! >> >> I have a matrix x and a vector y: >> >> x <- matrix(1:6, ncol = 2) >> y <- c(2,3) >> >> I need to multiply the first column of x by 2 (y[1]) and the second >> column of x by 3 (y[2]). >> >> Of course, I could do this - but it's column by column: >> >> x[,1] <- x[,1] * y[1] >> x[,2] <- x[,2] * y[2] >> x >> >> Or I could repeat each element of y and multiply two matrices - that's better: >> >> rep.row<-function(x,n){ >> matrix(rep(x,each=n),nrow=n) >> } >> y <- rep.row(y, nrow(x)) >> x * y >> >> However, maybe there is a more elegant r-like way of doing it? >> Thank you! >> >> -- >> Dimitri Liakhovitski >> > > -- > Sarah Goslee > http://www.functionaldiversity.org > > ______________________________________________ > 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.
I love R for it: if you experiment enough with t() you can find a way to multiply almost anything by almost anything! :) On Thu, Nov 3, 2016 at 5:32 PM, Rui Barradas <ruipbarradas at sapo.pt> wrote:> Hello, > > Take advantage that in R '*' recycles its arguments (the shorter one) and > that the operation is performed column-wise: > > t(y * t(x)) > > Hope this helps, > > Rui Barradas > > > Em 03-11-2016 21:05, Dimitri Liakhovitski escreveu: >> >> Hello! >> >> I have a matrix x and a vector y: >> >> x <- matrix(1:6, ncol = 2) >> y <- c(2,3) >> >> I need to multiply the first column of x by 2 (y[1]) and the second >> column of x by 3 (y[2]). >> >> Of course, I could do this - but it's column by column: >> >> x[,1] <- x[,1] * y[1] >> x[,2] <- x[,2] * y[2] >> x >> >> Or I could repeat each element of y and multiply two matrices - that's >> better: >> >> rep.row<-function(x,n){ >> matrix(rep(x,each=n),nrow=n) >> } >> y <- rep.row(y, nrow(x)) >> x * y >> >> However, maybe there is a more elegant r-like way of doing it? >> Thank you! >> >-- Dimitri Liakhovitski