2017-02-24 130 views
3

我喜欢乘以具有相同行的两个矩阵的列的所有可能组合。这意味着两个矩阵(例如,和b[3x4])将生成3×4矩阵,其元素为a[i,j]*a[k,j]。 (ik表示行范围从1至3和j表示列从1到4)如何将两个矩阵的列与所有组合相乘

我已经创建了一个例子,可以做到这一点的工作,但一直在寻找无for循环优雅的解决方案。

a <- matrix(1:12,3,4) 
b <- matrix(1:9,3,3) 
comb<-matrix(NA,3,(ncol(a)*ncol(b))) 

for (i in 1:nrow(a)){ 
comb[i,]<-apply(expand.grid(a[i,],b[i,]),1,prod) 
} 
comb 

这里,是3×3矩阵,b为3×4矩阵,并且通过梳各列相乘给出3x12矩阵的输出。我正在寻找优雅的解决方案,可以推广到这种乘法超过两个矩阵。

回答

3

这里有一些单行递减长度顺序:

t(sapply(1:3, function(i) tcrossprod(a[i, ], b[i, ]))) 

t(mapply(outer, split(a, 1:3), split(b, 1:3))) 

matrix(apply(a %o% b, c(2, 4), diag), 3) 

(b %x% a)[!!diag(3), ] 
+0

的!!诊断可能是'C(TRUE,逻辑(3))',我想......不知道这是一种提升。 – Frank

+0

感谢@Grothendieck提供多种优雅的解决方案。它让我有机会学习R的优秀特性 –

相关问题