gene <[EMAIL PROTECTED]> writes: > Apologies for the rather newbie question, but I haven't been able to > figure this out. > I've got a 3d matrix (though presumably, the answer would be the same > as for a 2d matrix) which I want to multiply by the values in a vector > like so: > > matrix m is: > > , , 1 > [,1] [,2] > [1,] 1 6 > [2,] 2 7 > [3,] 3 8 > > , , 2 > [,1] [,2] > [1,] 21 26 > [2,] 22 27 > [3,] 23 28 > > , , 3 > [,1] [,2] > [1,] 41 46 > [2,] 42 47 > [3,] 43 48 > > > vector v is c(2,10). > > I want to multiply m by v along the columns to get this result: > > , , 1 > [,1] [,2] > [1,] 2 60 > [2,] 4 70 > [3,] 6 80 > > , , 2 > [,1] [,2] > [1,] 42 260 > [2,] 44 270 > [3,] 46 280 > > , , 3 > [,1] [,2] > [1,] 82 460 > [2,] 84 470 > [3,] 86 480 > > > So, I figured I could do this by populating a new matrix the same > dimensions as m with the values from v repeated in the right order and > multiplying m by the new matrix. It feels like there should be a > one-step way to do this, though, especially since my real data is a > very large data set and it would be memory-inefficient to create a new > giant temporary matrix.
You don't need the full replicate matrix, only enough to allow recycling to do its job. In this case, m * rep(c(2,10),each=3) should do the trick. However, there's a function designed for the purpose: sweep(m, 2, v, "*") (well, maybe "almost designed for"; takes a little thought to realize that your problem is similar to sweeping out means along array extents.) -- O__ ---- Peter Dalgaard Blegdamsvej 3 c/ /'_ --- Dept. of Biostatistics 2200 Cph. N (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - ([EMAIL PROTECTED]) FAX: (+45) 35327907 ______________________________________________ [EMAIL PROTECTED] mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
