将列表中的矩阵相乘

时间:2014-08-10 23:15:08

标签: r matrix multiplication

我想将列表的多个矩阵相乘。我知道这适用于单个矩阵:

 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

结果如我所愿,当第二个矩阵为零时,结果中的值设置为零,否则结果保持不变:

       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

现在,考虑一个包含多个矩阵的列表,两个列表具有相同的矩阵,一个是值,另一个包含1/0但具有完全相同的大小。如何得到与上述相同的结果,例如,将两个第一矩阵相乘,然后将两个第二矩阵相乘,等等。上面的结果将是第一个矩阵对。

2 个答案:

答案 0 :(得分:4)

Map是您进行此类操作的朋友。首先,让我们使用您的数据制作一些示例列表:

l1 <- replicate(3,mat1,simplify=FALSE)
l2 <- replicate(3,mat2,simplify=FALSE)

现在,它很简单:

Map("*",l1,l2)

答案 1 :(得分:2)

一般来说,如何将两个列表的相应成员相乘?假设具有值的矩阵在list1中,而具有0/1的矩阵在list2中,那么一种方法是使用lapply

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

您生成的矩阵将是answer的元素。