如何将两个矩阵的列与所有组合相乘
问题描述:
我喜欢乘以具有相同行的两个矩阵的列的所有可能组合。这意味着两个矩阵(例如,和b[3x4]
)将生成3×4矩阵,其元素为a[i,j]*a[k,j]
。 (i
和k
表示行范围从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矩阵的输出。我正在寻找优雅的解决方案,可以推广到这种乘法超过两个矩阵。
答
这里有一些单行递减长度顺序:
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), ]
的!!诊断可能是'C(TRUE,逻辑(3))',我想......不知道这是一种提升。 – Frank
感谢@Grothendieck提供多种优雅的解决方案。它让我有机会学习R的优秀特性 –