Search code examples
rmatrixmultiplication

Multiply matrices in list


I would like to multiply multiple matrices of a list. I know that this works with a single matrix:

 x1  <- c(2,2,2,3,1,2,4,6,1,2,4)
 y1  <- c(5,4,3,3,4,2,1,6,4,2,3)
 x2  <- c(8,2,7,3,1,2,2,2,1,2,6)
 y2  <- c(1,3,3,3,1,2,4,3,1,2,8)
 x3  <- c(1,0,1,0,0,0,1,1,1,1,1)
 y3  <- c(1,0,0,0,0,0,1,1,0,1,0)
 x4  <- c(1,0,1,0,0,0,0,1,0,1,0)
 y4  <- c(1,0,1,0,0,0,1,1,1,1,1)

 mat1 <- cbind(x1,y1,x2,y2); mat1
 mat2 <- cbind(x3,y3,x4,y4); mat2

 mat3 <- mat1*mat2; mat3

The result is as I wished, when the second matrix had a zero, then the value was set to zero in the result, otherwise the result was kept the same:

       x1 y1 x2 y2
 [1,]  2  5  8  1
 [2,]  0  0  0  0
 [3,]  2  0  7  3
 [4,]  0  0  0  0
 [5,]  0  0  0  0
 [6,]  0  0  0  0
 [7,]  4  1  0  4
 [8,]  6  6  2  3
 [9,]  1  0  0  1
[10,]  2  2  2  2
[11,]  4  0  0  8

Now, consider a list with multiple matrices, both lists have the same matrices, one the values, the other one containing 1/0 but in the exact same size. How can I reach the same result as above, e.g., multiplying both first matrices, then both second matrices and so on. the result as above would be for the pair of first matrices.


Solution

  • So generically, how do you multiply corresponding members of two lists? Suppose the matrices with values are in list1 and those with 0/1 are in list2, then one way to do it is with lapply

     answer <- lapply(seq_along(list1),FUN=function(i) list1[[i]]*list2[[i]])
    

    Your resulting matrices will be the elements of answer.