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