2017-07-20 4 views
2

行列のリストがある場合はRで分かりますが、Reduce関数を使用してすべての行列に演算を適用できます。例:複数のリストに操作を適用する

l <- list(matrix(rnorm(16), 4, 4), matrix(rnorm(16), 4, 4)) 
Reduce(`*`, l) 

ただし、この操作を複数のリストに適用する場合はどうすればよいですか。私はforループでブルートフォースアプローチをすることができましたが、より良い方法があるはずです。私はmapply

l2 <- l 
mapply(`*`, l, l2, SIMPLIFY = FALSE) 

で二つのリストを行うことができます。しかし、私はより多くのその2を持っている場合、私はそれを解決するかどうかはわかりません。エラーで

以下の考えすべての結果:

l3 <- l2 
mapply(`*`, l, l2, l3, SIMPLIFY = FALSE) 
Error in .Primitive("*")(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]) : 
    operator needs one or two arguments 

Reduce(`*`, list(l, l2, l3)) 
Error in f(init, x[[i]]) : non-numeric argument to binary operator 

所望の出力は、各リスト内の各行列の要素単位製品と長さ2のリストです。ブルートフォースループは次のようになります

out <- vector("list", length = 2) 
for(i in 1:2){ 
    out[[i]] <- l[[i]] * l2[[i]] * l3[[i]] 
} 

答えて

6

ReduceMapのこの組み合わせは、ベースR.で

# copy the matrix list 
l3 <- l2 <- l 

out2 <- Reduce(function(x, y) Map(`*`, x, y), list(l, l2, l3)) 

を所望の結果を生成する

out2 
[[1]] 
       [,1]  [,2]  [,3]  [,4] 
[1,] -5.614351e-01 -0.06809906 -0.16847839 0.8450600 
[2,] -1.201886e-05 0.02008037 5.64656727 -2.4845526 
[3,] 5.587296e-02 -0.54793853 0.02254552 0.4608697 
[4,] -9.732049e-04 11.73020448 1.83408770 -1.4844601 

[[2]] 
       [,1]   [,2]  [,3]  [,4] 
[1,] -4.7372339865 -0.398501528 0.8918474 0.12433983 
[2,] 0.0007413892 0.151864126 -0.2138688 -0.10223482 
[3,] -0.0790846342 -0.413330364 2.0640126 -0.01549591 
[4,] -0.1888032661 -0.003773035 -0.9246891 -2.30731237 

我々は缶を返しますこれがOP内のforループと同じであることを確認してください。

identical(out, out2) 
[1] TRUE 
関連する問題