2016-09-28 231 views
3

我正在嘗試使用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]) 

但我沒有得到我所需要的。請幫忙?

+0

你可以在修正了ZheyuanLi提到的 – akrun

+0

@ZheyuanLi後,用'Map(函數(x,y,z)x%*%y%*%z,l1,l2,l3)'來做到這一點。謝謝你的評論。 – jogo

+1

謝謝李哲源。代碼根據您的評論更正。 – useryk

回答

4

的方面,我建議您使用以下:

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...的魔力。

+0

謝謝李哲源!這太棒了。 – useryk

1

看來你想要元素方面的乘法。這是通過*運營商完成的。如果這些人在列表中(避免了創建一個大的載體和損失所有維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 
+0

我將請求解釋爲以元素方式訪問「[[n]]」 - th元素。我可能錯了。 –

0

這裏是你在想什麼矩陣乘法

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)