使用R中的apply()在三个矩阵列表上进行矩阵乘法?

使用R中的apply()在三个矩阵列表上进行矩阵乘法?,r,matrix,R,Matrix,我尝试在三个矩阵列表上进行矩阵乘法,使用apply()或类似的方法 以下是示例数据: mat1 <- matrix(c(1:16), 4, 4, byrow = TRUE) mat2 <- matrix(c(1:16), 4, 4, byrow = TRUE) mat3 <- matrix(c(1:16), 4, 4, byrow = TRUE) l1 <- list(mat1, mat2, mat3) l2 <- list(mat1, mat2, mat3) l

我尝试在三个矩阵列表上进行矩阵乘法,使用apply()或类似的方法

以下是示例数据:

mat1 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat2 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat3 <- matrix(c(1:16), 4, 4, byrow = TRUE)

l1 <- list(mat1, mat2, mat3)
l2 <- list(mat1, mat2, mat3)
l3 <- list(mat1, mat2, mat3)
我尝试了以下方法:

mat <- lapply(c(mat1, mat2, mat3), function(x) x[1] %*% x[2] %*% x[3])
mat1 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat2 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat3 <- matrix(c(1:16), 4, 4, byrow = TRUE)

l1 <- list(mat1, mat2, mat3)
l2 <- list(mat1, mat2, mat3)
l3 <- list(mat1, mat2, mat3)

f <- function (...) Reduce("%*%", list(...))
mapply(f, l1, l2, l3, SIMPLIFY = FALSE) 

#[[1]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680
#
#[[2]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680
#
#[[3]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680

mat看来您需要元素级乘法。这是通过
*
-运算符完成的。如果这些都在一个列表中(避免了创建一个大向量并丢失所有维度的c()操作),那么您可以使用
Reduce

> l1 <- list( mat1, mat2, mat3)
> 
> Reduce("*", l1)
     [,1] [,2] [,3] [,4]
[1,]    1    8   27   64
[2,]  125  216  343  512
[3,]  729 1000 1331 1728
[4,] 2197 2744 3375 4096
如果按照建议,您需要矩阵乘法,那么可能是这样(连同我的矩阵列表):


这是你想要的矩阵乘法

mat1 <- as.list(matrix(c(1:16), 4, 4, byrow = TRUE))
mat2 <- as.list(matrix(c(1:16), 4, 4, byrow = TRUE))
mat3 <- as.list(matrix(c(1:16), 4, 4, byrow = TRUE))

l1 <- list(mat1, mat2, mat3)
l2 <- list(mat1, mat2, mat3)
l3 <- list(mat1, mat2, mat3)

matrix(unlist(l1[[1]]),4,4) %*% matrix(unlist(l2[[1]]),4,4) %*% matrix(unlist(l3[[1]]),4,4)
matrix(unlist(l1[[2]]),4,4) %*% matrix(unlist(l2[[2]]),4,4) %*% matrix(unlist(l3[[2]]),4,4)
matrix(unlist(l1[[3]]),4,4) %*% matrix(unlist(l2[[3]]),4,4) %*% matrix(unlist(l3[[3]]),4,4)

mat1我建议使用以下方法:

mat <- lapply(c(mat1, mat2, mat3), function(x) x[1] %*% x[2] %*% x[3])
mat1 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat2 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat3 <- matrix(c(1:16), 4, 4, byrow = TRUE)

l1 <- list(mat1, mat2, mat3)
l2 <- list(mat1, mat2, mat3)
l3 <- list(mat1, mat2, mat3)

f <- function (...) Reduce("%*%", list(...))
mapply(f, l1, l2, l3, SIMPLIFY = FALSE) 

#[[1]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680
#
#[[2]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680
#
#[[3]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680

也行。这就是
Reduce
..

的神奇力量。你可以通过
Map(函数(x,y,z)x%*%y%*%z,l1,l2,l3)
来实现这一点。在更正了ZheyuanLi提到的内容后,我将访问“[[n]]”的请求解释为元素明智。我可能错了。
mat1 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat2 <- matrix(c(1:16), 4, 4, byrow = TRUE)
mat3 <- matrix(c(1:16), 4, 4, byrow = TRUE)

l1 <- list(mat1, mat2, mat3)
l2 <- list(mat1, mat2, mat3)
l3 <- list(mat1, mat2, mat3)

f <- function (...) Reduce("%*%", list(...))
mapply(f, l1, l2, l3, SIMPLIFY = FALSE) 

#[[1]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680
#
#[[2]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680
#
#[[3]]
#      [,1]  [,2]  [,3]  [,4]
#[1,]  3140  3560  3980  4400
#[2,]  7268  8232  9196 10160
#[3,] 11396 12904 14412 15920
#[4,] 15524 17576 19628 21680
mapply(f, l1, l2, l3, l1, l3, l3, SIMPLIFY = FALSE)