2015-11-20 40 views
3

我想用两个不同维数的阵列(a1 = [48,38,31]和b1 [48,38])乘(或除)。到目前为止,我在第三维上使用了for循环。但是,我想知道如何使用(如果可能的话)apply。比方说,我有以下样品:不同维度的乘法阵列

a1<- array(rnorm(20), dim=c(2,3,3)) 
b1<- array(rnorm(20), dim=c(2,3)) 

如果我试图做直接A1/B1(或*)我不能因为他们需要有相同的尺寸。所以我用一个for循环:

for(i in 1:3){ 
    m1[,,i] <- a1[,,i]/b1 
} 

但我想避免使用循环。

+0

尝试'应用(a1,3,FUN =函数(x)x/b1)' – akrun

+0

请考虑接受解决方案。 – akrun

回答

2

一种选择是

array(c(a1)/rep(b1, dim(a1)[3]), dim= dim(a1)) 

或者我们可以使用apply

apply(a1, 3, FUN=function(x) x/b1) 
1

或者,您可以使用sweep函数,它是专门做这种手术。

a1<- array(rnorm(20), dim=c(2,3,3)) 
b1<- array(rnorm(20), dim=c(2,3)) 

m1 <- array(0, dim=c(2,3,3)) 

# original solution 
for(i in 1:3){ 
    m1[,,i] <- a1[,,i]/b1 
} 

# apply sweep 
# to avoid the warning info add 'check.margin=F' 
m2 <- sweep(a1, 1, b1, "/", check.margin=F) 

all.equal(m1, m2) 
#[1] TRUE