使用R中的apply()矩阵乘以三个矩阵列表?
我正在尝试使用apply()或类似的方法对三个矩阵列表进行矩阵乘法运算。使用R中的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)
我想做到以下几点将它们放到一个新的列表,每个相应的[[N]在所有三个列表:
l1[[1]] %*% l2[[1]] %*% l3[[1]]
l1[[2]] %*% l2[[2]] %*% l3[[2]]
l1[[3]] %*% l2[[3]] %*% l3[[3]]
我试过如下:
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
好的一点是,它并不重要,你有多少名单喂mapply
。例如,
mapply(f, l1, l2, l3, l1, l3, l3, SIMPLIFY = FALSE)
也适用。这是Reduce
和...
的魔力。
谢谢*!这太棒了。 – useryk
看来你想要元素方面的乘法。这是通过*
运营商完成的。如果这些人在列表中(避免了创建一个大的载体和损失所有维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
如果wnated物联网作为一个载体,你可以再使用c
:
c(Reduce("*", l1))
[1] 1 125 729 2197 8 216 1000 2744 27 343 1331 3375 64 512 1728
[16] 4096
如果按照建议你想矩阵乘法,那么也许这(我的矩阵列表):
c(Reduce("%*%", l1))
[1] 3140 7268 11396 15524 3560 8232 12904 17576 3980 9196 14412 19628 4400
[14] 10160 15920 21680
我将请求解释为以元素方式访问“[[n]]” - th元素。我可能错了。 –
这里是你在想什么矩阵乘法
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)
你可以在修正了ZheyuanLi提到的 – akrun
@ZheyuanLi后,用'Map(函数(x,y,z)x%*%y%*%z,l1,l2,l3)'来做到这一点。谢谢你的评论。 – jogo
谢谢*。代码根据您的评论更正。 – useryk