Rで行列のリストを初期化する簡単な方法があるかどうか疑問に思いました。たとえば、次と同じ結果を再現するための(ワンライナー)を探しています。
output_array = list()
for(i in 1:10){
output_array[i] = diag(2)
}
ありがとう!
*apply のこのラッパーも試してください:
replicate(10, diag(2), simplify=F)
このワンライナーはうまくいくはずです
rep(list(diag(2)), 10)
マトリックスの内容を変化させたい場合は、次のようなものです
lapply(1:10, function(x) matrix(1:x^2, x, x)
より適切になります。匿名関数の内容は明らかに私の例よりも少し便利ですが、原則は同じです
レプリケートとレップの両方が推奨されています。参考までに: 違いは、渡される式の評価です。'rep' はその引数を入力として評価しますが、'replicate' はそれらを 'loop' 内で評価します。
これは乱数で確認できます。式 'diag(rnorm(2))' が複数回評価されるため、replicate では数値が異なりますが、rep では 1 回だけ評価され、値が繰り返されます。
rep(list(diag(rnorm(2))),2)
[[1]]
[,1] [,2]
[1,] 1.0844 0.0000
[2,] 0.0000 -2.3457
[[2]]
[,1] [,2]
[1,] 1.0844 0.0000
[2,] 0.0000 -2.3457
レプリケート(2,diag(rnorm(2)))
, , 1
[,1] [,2]
[1,] 0.42912 0.00000
[2,] 0.00000 0.50606
、 、 2
[,1] [,2]
[1,] -0.57474 0.00000
[2,] 0.00000 -0.54663
これはあなたにとって重要かもしれませんし、そうでないかもしれませんが、パフォーマンスへの影響があります。
system.time(replicate(1000, diag(100),simplify=F))
ユーザーシステム経過
0.640 0.032 0.674
system.time(rep(list(diag(100)),1000))
ユーザーシステム経過
0.072 0.036 0.111
試す
lapply(1:10, diag, 2)
forループでは、書き込む必要が[[
ありましたoutput_array[[i]] = diag(2)
配列を使用できます:
h <- array(1:2, c(2,2,10))
h[,,2] ####
[,1] [,2]
[1,] 1 1
[2,] 2 2