如何将两个矩阵相乘以得到一个数组?

时间:2016-02-26 02:17:57

标签: r matrix multiplying

我有两个矩阵:

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

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

如何在不使用for循环的情况下将这两个矩阵乘以R 得到一个三维数组C [2,4,3] C [1,] = A * B [,1]和C [2 ,,] = A * B [,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|

2 个答案:

答案 0 :(得分:3)

基于制作匹配尺寸矩阵的新版本:

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

答案 1 :(得分: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的回答进行基准测试,但我不确定它是否值得用这么小的例子来做,我不能为构建一个更大的例子而感到困扰...