通过将函数应用于矩阵的每一行来创建3D数组

时间:2018-03-08 17:47:49

标签: r

我有一个从矢量创建二维数组的函数。我想将此函数应用于矩阵的每一行,以获得三维数组,其中行对应于输入矩阵的行,而维度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问题似乎或多或少地提出了同样的问题,但仍然没有答案。

1 个答案:

答案 0 :(得分:2)

您的方法非常好,但下面的内容可能看起来更直观。首先,我们将您的函数应用于矩阵的每一行并获得一个列表:

arrs <- sapply(1:nrow(mat), function(i) rep.fun(mat[i, ]), simplify = FALSE)

然后我们将这些结果与第一维结合:

library(abind)
abind(arrs, along = 1)