[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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list