2016-02-26 2 views
0

У меня есть две матрицы:Как умножить две матрицы для получения массива?

A = 
|1 0 1| 
|0 1 1| 
|1 1 1| 
|1 1 1| 

B = 
|1 1| 
|0 1| 
|0 0| 
|1 1| 

Как можно перемножить эти две матрицы в R без использования for петлю , чтобы получить 3 мерный массив C [2,4,3], что С [1 ,,] = а * в [1] и с [2 ,,] = а * в [2]

C[1,,]= 
|1 0 1| 
|0 0 0| 
|0 0 0| 
|1 1 1| 

C[2,,]= 
|1 0 1| 
|0 1 1| 
|0 0 0| 
|1 1 1| 
+0

было бы полезно знать * почему * вы хотите избежать циклов. Эффективность? Elegance? Проблема с домашней работой (кажется маловероятной)? –

+0

Эта часть кода должна быть уже внутри другого цикла, а B и A невелики по размеру. Поэтому я хочу сделать его эффективным. – user2079550

+1

хорошо, * самый * эффективный способ будет prob. записать его в Rcpp. Я попытался, но не смог (пока) сделать это с помощью продукта Kronecker + 'array()' + 'aperm()' –

ответ

2

Новая версия на основе решений, соответствующих матриц размеров:

array(
    A[,rep(seq_len(ncol(A)),ncol(B))] * B[,rep(seq_len(ncol(B)), each=ncol(A))], 
    dim=c(nrow(A),ncol(A),ncol(B)) 
) 

Технически еще цикл, но так посудить меня:

A <- matrix(c(1,0,1,1,0,1,1,1,1,1,1,1),nrow=4) 
B <- matrix(c(1,0,0,1,1,1,0,1),nrow=4) 

mapply(`*`, list(A), split(B,col(B)), SIMPLIFY="array") 

#, , 1 
# 
#  [,1] [,2] [,3] 
#[1,] 1 0 1 
#[2,] 0 0 0 
#[3,] 0 0 0 
#[4,] 1 1 1 
# 
#, , 2 
# 
#  [,1] [,2] [,3] 
#[1,] 1 0 1 
#[2,] 0 1 1 
#[3,] 0 0 0 
#[4,] 1 1 1 
+0

Спасибо за ваш ответ. Как вы сказали, это все еще цикл, и мне нужно много времени в моем коде – user2079550

+1

@ user2079550 - попробуйте новый вариант, поскольку он избегает циклирования. – thelatemail

3

Как насчет:

n <- ncol(A) 
m <- ncol(B) 
k <- nrow(A) 
B1 <- c(apply(B,MARGIN=2,rep,n)) 
aperm(array(B1*c(A),c(k,n,m)), 
     c(3,1,2)) 

я мог тест против @ thelatemail отвечают, но я не уверен, что это стоит делать с таким небольшой пример, и я не могу потрудиться, чтобы построить более крупный ...

+0

Спасибо, я проверю это и напишу здесь несколько отзывов. – user2079550

Смежные вопросы