Arrays 在R中不循环地组装数组
假设有两个矩阵Arrays 在R中不循环地组装数组,arrays,r,for-loop,Arrays,R,For Loop,假设有两个矩阵A和B: (A <- mdat <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12), nrow = 4, ncol = 3)) [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12 (B <- mdat <- matrix(rev(c(1,2,3,4,5,6,7,8,9,10,11,1
A
和B
:
(A <- mdat <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12), nrow = 4, ncol = 3))
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
(B <- mdat <- matrix(rev(c(1,2,3,4,5,6,7,8,9,10,11,12)), nrow = 4, ncol = 3))
[,1] [,2] [,3]
[1,] 12 8 4
[2,] 11 7 3
[3,] 10 6 2
[4,] 9 5 1
如何在没有循环的情况下很好地完成这项工作?这样行吗
i_vec <- rep(1:ncol(A),each = ncol(B))
j_vec <- rep(1:ncol(B),ncol(A))
C <- array(0, dim=c(4,3,3))
Map(function(i,j){C[,i,j] <<- A[,i] + B[,j]},i_vec,j_vec)
# > C
# , , 1
#
# [,1] [,2] [,3]
# [1,] 13 17 21
# [2,] 13 17 21
# [3,] 13 17 21
# [4,] 13 17 21
#
# , , 2
#
# [,1] [,2] [,3]
# [1,] 9 13 17
# [2,] 9 13 17
# [3,] 9 13 17
# [4,] 9 13 17
#
# , , 3
#
# [,1] [,2] [,3]
# [1,] 5 9 13
# [2,] 5 9 13
# [3,] 5 9 13
# [4,] 5 9 13
i_vec这样行吗
i_vec <- rep(1:ncol(A),each = ncol(B))
j_vec <- rep(1:ncol(B),ncol(A))
C <- array(0, dim=c(4,3,3))
Map(function(i,j){C[,i,j] <<- A[,i] + B[,j]},i_vec,j_vec)
# > C
# , , 1
#
# [,1] [,2] [,3]
# [1,] 13 17 21
# [2,] 13 17 21
# [3,] 13 17 21
# [4,] 13 17 21
#
# , , 2
#
# [,1] [,2] [,3]
# [1,] 9 13 17
# [2,] 9 13 17
# [3,] 9 13 17
# [4,] 9 13 17
#
# , , 3
#
# [,1] [,2] [,3]
# [1,] 5 9 13
# [2,] 5 9 13
# [3,] 5 9 13
# [4,] 5 9 13
i_vec重复每个矩阵的列,然后添加并重置维度:
out <- A[,rep(1:ncol(A),3)] + B[,rep(1:ncol(B),each=3)]
dim(out) <- c(4,3,3)
identical(out,C)
#[1] TRUE
out重复每个矩阵的列,然后添加并重置尺寸:
out <- A[,rep(1:ncol(A),3)] + B[,rep(1:ncol(B),each=3)]
dim(out) <- c(4,3,3)
identical(out,C)
#[1] TRUE
out您可以使用apply
方法(从您的注释中,但切换A和B的位置)构造具有所需维度属性的数组:
您可以使用apply
方法(从您的注释中,但切换A和B的位置)构造具有所需维度属性的数组:
你的例子不适用。您的循环未正确指定,并且C
不存在可分配给的对象。我认为您需要“应用”系列中的某些内容:-请查看“另请参阅”部分以了解类似的项目。@最近的邮件忘记了一行代码。刚刚添加。@AChervony如何将应用(A,2,“+”,B)
转换为预期的结果?@Psidom让我大吃一惊。看看他们的答案(+1)你的例子不适用。您的循环未正确指定,并且C
不存在可分配给的对象。我认为您需要“应用”系列中的某些内容:-请查看“另请参阅”部分以了解类似的项目。@最近的邮件忘记了一行代码。刚刚添加。@AChervony如何将应用(A,2,“+”,B)
转换为预期的结果?@Psidom让我大吃一惊。见他们的答案(+1)