我有一个从矢量创建二维数组的函数。我想将此函数应用于矩阵的每一行,以获得三维数组,其中行对应于输入矩阵的行,而维度2和3对应于函数的维度1和2输出
请注意,速度在这里很重要,所以我想尽可能地进行矢量化。
以下代码可以满足我的需求,但最终的重塑令人困惑。我觉得必须有一种更直接的方式吗?
# Vectorized apply a function across rows of a matrix to yield a 3-D array
# Create 2x4 matrix
mat <- matrix(1:8, ncol = 4)
# Function to create 1 x 4 x 3 array from vector
rep.fun <- function(x) {
array(rep(x, times = 3), dim = c(1, length(x), 3))
}
# Use apply to apply the function; then reshape the resulting array in a confusing way
array(t(apply(mat, MARGIN = 1, FUN = rep.fun)), dim = c(2, 4, 3))
#> , , 1
#>
#> [,1] [,2] [,3] [,4]
#> [1,] 1 3 5 7
#> [2,] 2 4 6 8
#>
#> , , 2
#>
#> [,1] [,2] [,3] [,4]
#> [1,] 1 3 5 7
#> [2,] 2 4 6 8
#>
#> , , 3
#>
#> [,1] [,2] [,3] [,4]
#> [1,] 1 3 5 7
#> [2,] 2 4 6 8
This问题似乎或多或少地提出了同样的问题,但仍然没有答案。
答案 0 :(得分:2)
您的方法非常好,但下面的内容可能看起来更直观。首先,我们将您的函数应用于矩阵的每一行并获得一个列表:
arrs <- sapply(1:nrow(mat), function(i) rep.fun(mat[i, ]), simplify = FALSE)
然后我们将这些结果与第一维结合:
library(abind)
abind(arrs, along = 1)