7

Rで行列のリストを初期化する簡単な方法があるかどうか疑問に思いました。たとえば、次と同じ結果を再現するための(ワンライナー)を探しています。

output_array = list()
for(i in 1:10){
output_array[i] = diag(2)
}

ありがとう!

4

5 に答える 5

11

*apply のこのラッパーも試してください:

replicate(10, diag(2), simplify=F)
于 2013-01-11T18:49:31.050 に答える
5

このワンライナーはうまくいくはずです

rep(list(diag(2)), 10)

マトリックスの内容を変化させたい場合は、次のようなものです

lapply(1:10, function(x) matrix(1:x^2, x, x)

より適切になります。匿名関数の内容は明らかに私の例よりも少し便利ですが、原則は同じです

于 2013-01-11T18:49:39.740 に答える
3

レプリケートとレップの両方が推奨されています。参考までに: 違いは、渡される式の評価です。'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

于 2013-01-12T02:04:16.430 に答える
2

試す

lapply(1:10, diag, 2)

forループでは、書き込む必要が[[ありましたoutput_array[[i]] = diag(2)

于 2013-01-11T18:47:18.763 に答える
0

配列を使用できます:

 h <- array(1:2, c(2,2,10))

h[,,2]        ####
     [,1] [,2]
[1,]    1    1
[2,]    2    2
于 2013-01-11T19:13:28.077 に答える