gene <gene02_r at smalltime.com> 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
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907