2016-09-28 5 views
3

私は、apply()などを使って3つの行列のリストに対して行列の乗算をしようとしています。ここでRのapply()を使用した行列の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) 

私は次の操作を行うと、それぞれが、すべての3つのリストに[[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(function(x、y、z)x%*%y%*%z、l1、l2、l3)発言をありがとう。 – jogo

+1

ありがとうZheyuan Li。あなたのコメントごとにコードが修正されました。 – 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

ありがとうZheyuan Li!これは最高です。 – useryk

1

要素ごとの乗算が必要なようです。これは* - オペレータで実行されます。これらは、(一つの大きなベクトルと損失のすべてのディメンションを作成し、C()操作の回避)のリストにあったなら、あなたはReduceを使用することができます:あなたはベクトルとしてIOT wnated場合

> 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 

は、あなたがして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]]"番目の要素へのアクセス要求を要素ごとに解釈しました。私は間違っているかもしれない。 –

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)