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)