[R] Matrix operations in a list

Marc Schwartz marc_schwartz at comcast.net
Tue Jan 23 16:43:53 CET 2007


On Tue, 2007-01-23 at 10:21 -0500, Doran, Harold wrote:
> I have matrices stored within a list like something as follows:
> 
> a <- list(matrix(rnorm(50), ncol=5), matrix(rnorm(50), ncol=5))
> b <- list(matrix(rnorm(50), nrow=5), matrix(rnorm(50), nrow=5))
> 
> I don't recall how to perform matrix multiplication on each list element
> such that the result is a new list 
> 
> result <- list(a[[1]]%*%b[[1]], a[[2]]%*%b[[2]])
> 
> I think I'm close with mapply(), but I'm doing something silly
> 
> mapply('%*%', a,b)
> 
> Thanks.
> Harold

Harold,

That should basically be working.  Just note that by default, each
resultant matrix is put into a column (vector) format, rather than as a
matrix.

 Res <- mapply("%*%", a, b)
 Res1 <- a[[1]] %*% b[[1]]
 Res2 <- a[[2]] %*% b[[2]]


> str(Res)
 num [1:100, 1:2]  0.1713  0.8290 -0.0864  3.5420 -1.4638 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : NULL

> all.equal(Res[, 1], as.vector(Res1))
[1] TRUE

> all.equal(Res[, 2], as.vector(Res2))
[1] TRUE

If you want the results to be a list of two matrices, you would do
something like:

Res <- mapply("%*%", a, b, SIMPLIFY = FALSE)

> str(Res)
List of 2
 $ : num [1:10, 1:10]  0.1713  0.8290 -0.0864  3.5420 -1.4638 ...
 $ : num [1:10, 1:10]  0.220 -2.048 -0.135 -2.121 -0.399 ...

> all.equal(Res1, Res[[1]])
[1] TRUE

> all.equal(Res2, Res[[2]])
[1] TRUE


HTH,

Marc Schwartz



More information about the R-help mailing list