创建没有for循环的矩阵数组

时间:2019-07-28 15:43:12

标签: arrays r matrix

使用以下循环,我可以创建一个包含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循环或使用任何其他函数来做到吗?感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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