# [R] matrix dimension and for loop

ggrothendieck@yifan.net ggrothendieck at yifan.net
Wed Apr 10 15:55:26 CEST 2002

```> My questions are that if I have
>
> > x<-rnorm(50)
> > dim(x)<-c(10,5)
> > y=1:5
> > Z<-matrix(0,NROW(x),NROW(y))
> > for (j in 1:NROW(y)) Z[,j]<-x[,j]*y[j]
>
> 1. Is there any other way to write this without 'for'
> loop?
>
> 2. and if I don't know the dimension of x, which could
> be only 1 column, how could I write the command

I thought I would collect together some of the solutions that have
been posted as well as mention a few others.  I have also added
some discussion particularly with reference to the second question.
There appears to be a myriad of ways to address this problem in R.
Since I am learning R I found it useful for myself to explore various
solutions and maybe others will find this helpful too.

The problem is to multiply the jth column of a matrix x by y[j] for each j.
Its also possible for x to be a vector in which case y may be a scalar.

The first 4 solutions regard x as a one column matrix if x is a vector and
so always return a matrix.  The 5th solution returns a vector if x is a
vector.

1. Matrix multiplication. Note that if x is a vector then it is treated as a
one column matrix.  Also note that NROW(x) is the same as nrow(x), if x is a
matrix; however, if x is a vector, then NROW(x) is its length while nrow(x)
is NULL.  Thus it is important here to use NROW and not nrow. This is
discussed in the help on nrow.

x %*% diag(y,NROW(x))

2. Scalar multiplication and transpose.  Note that if x is a vector then t(x)
is a row matrix made out of it, so no special processing is necessary.

t(t(x)*y)

3. Sweep.  Note that as.matrix(x) is the same as x, if x is a matrix, but is a
column matrix made out of x, if x is a vector.

sweep(as.matrix(x),2,y,FUN="*")

4. Scalar multiplication and col.  col(m) is a matrix the same size as
matrix m.  Every entry in column j equals j (for all columns).

as.matrix(x) * y[col(as.matrix(x))]

5. Variant of #4. The following is the same as #4 except that it returns a
vector if x is a vector.

x * y[col(as.matrix(x))]

as.matrix(x) can be abbreviated to just x, in #3, #4 and #5
if x is known always to be a matrix.  For example, the last two solutions
would be  just x*y[col(x)].

I had not expected the last 2 solutions to work in the case that x is a vector
and y is a scalar, since they involve subscripting of a scalar, but apparently
that works in R.

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```