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' 在'循环'内评估它们。

您可以通过随机数看到这一点。对于复制,数字是不同的,因为表达式'diag(rnorm(2))'被多次评估,而对于rep,它只被评估一次并且值被重复。

代表(列表(诊断(诊断(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,诊断(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(复制(1000,诊断(100),简化=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 回答