【问题标题】:Creating Array of matrices without for loop在没有 for 循环的情况下创建矩阵数组
【发布时间】:2019-12-06 02:54:48
【问题描述】:

使用下面的循环,我可以创建一个包含 4 个矩阵的数组。是否有任何函数可以在没有 for 循环的情况下创建这个数组。使用外部函数,我可以单独创建矩阵。

time=c(0,0.5,0.7) 
beta=matrix(1:40, nrow=5, ncol=8)
array_mat <- array(NA, dim = c(5, 3, 4))
for (i in 1:5) {
  for (j in 1:3) {
    for (k in 1:4) {
      array_mat[i, j, k] <- beta[i, k * 2 - 1] + beta[i, k * 2] * time[j]
    }
  }
}

输出是

array_mat
, , 1

     [,1] [,2] [,3]
[1,]    1  4.0  5.2
[2,]    2  5.5  6.9
[3,]    3  7.0  8.6
[4,]    4  8.5 10.3
[5,]    5 10.0 12.0

, , 2

     [,1] [,2] [,3]
[1,]   11 19.0 22.2
[2,]   12 20.5 23.9
[3,]   13 22.0 25.6
[4,]   14 23.5 27.3
[5,]   15 25.0 29.0

, , 3

     [,1] [,2] [,3]
[1,]   21 34.0 39.2
[2,]   22 35.5 40.9
[3,]   23 37.0 42.6
[4,]   24 38.5 44.3
[5,]   25 40.0 46.0

, , 4

     [,1] [,2] [,3]
[1,]   31 49.0 56.2
[2,]   32 50.5 57.9
[3,]   33 52.0 59.6
[4,]   34 53.5 61.3
[5,]   35 55.0 63.0

我可以在不使用 for 循环或使用任何其他函数的情况下做到这一点吗?感谢你的帮助。

【问题讨论】:

  • @akrun 我可以使用 outer() 函数创建四个矩阵中的任何一个。我正在寻找像 outer() 这样的函数或任何其他函数来创建这个矩阵数组。
  • 在那种情况下out &lt;- crossing(v1 = 1:5, v2 = 1:3, v3 = 1:4) %&gt;% pmap_dbl(~ beta[..1, ..3 * 2 - 1] + beta[..1, ..3 * 2] * time[..2])
  • 您会只对一个循环感兴趣吗?
  • 我很想看看循环。 @RuiBarradas

标签: arrays r matrix


【解决方案1】:

有一个accepted answer,但考虑到我的评论是 OP 的reply,就这样吧。

array_mat2 <- array(NA, dim = c(5, 3, 4))
for(j in 1:3){
  array_mat2[, j, ] <- beta[, 2*(1:4) - 1] + beta[, 2*(1:4)]*time[j]
}
identical(array_mat, array_mat2)
#[1] TRUE

【讨论】:

【解决方案2】:

这是一个纯粹的基于数组的方法:

time <- c(0, 0.5, 0.7) 
beta <- matrix(1:40, nrow = 5, ncol = 8)

aperm(
    outer(beta[, 2*1:4], time) +    # multiply even cols by time
        replicate(3, beta[, 2*1:4 - 1]),    # add odd cols
    c(1, 3, 2)    # rearrange
)
#> , , 1
#> 
#>      [,1] [,2] [,3]
#> [1,]    1  4.0  5.2
#> [2,]    2  5.5  6.9
#> [3,]    3  7.0  8.6
#> [4,]    4  8.5 10.3
#> [5,]    5 10.0 12.0
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3]
#> [1,]   11 19.0 22.2
#> [2,]   12 20.5 23.9
#> [3,]   13 22.0 25.6
#> [4,]   14 23.5 27.3
#> [5,]   15 25.0 29.0
#> 
#> , , 3
#> 
#>      [,1] [,2] [,3]
#> [1,]   21 34.0 39.2
#> [2,]   22 35.5 40.9
#> [3,]   23 37.0 42.6
#> [4,]   24 38.5 44.3
#> [5,]   25 40.0 46.0
#> 
#> , , 4
#> 
#>      [,1] [,2] [,3]
#> [1,]   31 49.0 56.2
#> [2,]   32 50.5 57.9
#> [3,]   33 52.0 59.6
#> [4,]   34 53.5 61.3
#> [5,]   35 55.0 63.0

【讨论】:

  • 你能解释一下 c(1, 3, 2) 重排术语吗? @alistaire
  • aperm 就像 t 泛化为数组。但是,不只有一个转置,所以您需要指定重新排列维度的顺序,其中 1 是行,2 是列,3 是第三维度,等等,所以aperm(mat, c(2, 1)) 与 @987654326 相同@。这里aperm(..., c(1, 3, 2)) 表示它正在翻转第二维和第三维并保持行到位。
  • 如果我想在模型中添加另一个术语,如beta[, 2*1:4], time^2,如何添加?
  • 这个问题你能看看吗(]stackoverflow.com/questions/57679795/…)
猜你喜欢
  • 2016-10-31
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2014-05-01
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多