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