# [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

```