10

行、列、レイヤーを含む 3 次元配列があるとします。

A <- array (1:27, c(3,3,3))

のように、入力として行列を取り、出力として行列を返す関数があるとしますt

この関数を配列の各レイヤーに適用して、最初の配列と同じサイズの別の配列を返すにはどうすればよいでしょうか?

applyどうにかできるはずなのにできない気がする。

おまけの質問 (これに答えていただければ非常にありがたいです): これを行う方が速いですか、それとも各レイヤー マトリックスとlapplyそれらに対する関数のリストを作成する方が速いですか?

--

編集: この質問に回答があるとは思わないでください。以下の回答は質問に回答していません。

4

2 に答える 2

1

転置の別の可能性は functionapermです。

A <- array (1:27, c(3,3,3))
# aperm permute the dimensions in the given order
# here we want to permute dimension 1 and 2
# so the new order is 2-1-3 instead of 1-2-3
aperm(A, c(2,1,3)) 
    , , 1

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

, , 2

     [,1] [,2] [,3]
[1,]   10   11   12
[2,]   13   14   15
[3,]   16   17   18

, , 3

     [,1] [,2] [,3]
[1,]   19   20   21
[2,]   22   23   24
[3,]   25   26   27

各レイヤーに関数を適用すること (たとえば、各レイヤーに異なる値を掛けたい場合) に関する限り、別の可能性があります。

vec <- c(1,5,3)
lapply(seq_along(vec), function(x)A[,,x]*vec[x])
[[1]]
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

[[2]]
     [,1] [,2] [,3]
[1,]   50   65   80
[2,]   55   70   85
[3,]   60   75   90

[[3]]
     [,1] [,2] [,3]
[1,]   57   66   75
[2,]   60   69   78
[3,]   63   72   81

しかし、ご覧のとおり、リストを作成するため、 function を使用してもう 1 つの手順が必要ですsimplify2array

simplify2array(lapply(seq_along(vec),function(x)A[,,x]*vec[x]))
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   50   65   80
[2,]   55   70   85
[3,]   60   75   90

, , 3

     [,1] [,2] [,3]
[1,]   57   66   75
[2,]   60   69   78
[3,]   63   72   81

または直接sapply

sapply(seq_along(vec), function(x)A[,,x]*vec[x], simplify="array")
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]   50   65   80
[2,]   55   70   85
[3,]   60   75   90

, , 3

     [,1] [,2] [,3]
[1,]   57   66   75
[2,]   60   69   78
[3,]   63   72   81
于 2012-12-12T10:16:33.073 に答える