リストの中に行列があってそれをくっつけてテンソルっぽくしたい

こんな感じで、リストの中に行と列の数が等しい行列があったとする。長さは簡単のため2にしている。

a <- mapply(function(z) matrix(z, 2), list(1:6, -(1:6)), SIMPLIFY=FALSE)
[[1]]
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

[[2]]
     [,1] [,2] [,3]
[1,]   -1   -3   -5
[2,]   -2   -4   -6

これをいわゆるarray 形式にしたい。愚直にやるならこんな感じ。

array(unlist(a), c(2, 3, 2))
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]   -1   -3   -5
[2,]   -2   -4   -6

 
abind というパッケージがあるのでこれを使うなら、along でどこにbind するか指定できるので

library(abind)
abind(a[[1]], a[[2]], along=3)
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]   -1   -3   -5
[2,]   -2   -4   -6

 
昔やったdo.call でやるなら、リスト構造をいじることなく直接書ける。

do.call(abind, c(a, along=3))
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]   -1   -3   -5
[2,]   -2   -4   -6