Re: [R] Matrix operations in a list

From: Marc Schwartz <marc_schwartz_at_comcast.net>
Date: Tue 23 Jan 2007 - 15:43:53 GMT

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


> 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



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Wed Jan 24 02:56:57 2007

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Tue 23 Jan 2007 - 16:30:29 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.