我想将列表的多个矩阵相乘。我知道这适用于单个矩阵:
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但具有完全相同的大小。如何得到与上述相同的结果,例如,将两个第一矩阵相乘,然后将两个第二矩阵相乘,等等。上面的结果将是第一个矩阵对。
答案 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
的元素。