[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