2015-11-20 2 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 = функция (х) х/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 
Смежные вопросы